这种使用malloc的方式不安全吗?
如果x和y参数从不受信任的用户处接收数据,这段代码是否会造成一些安全威胁这种使用malloc的方式不安全吗?,c,security,C,Security,如果x和y参数从不受信任的用户处接收数据,这段代码是否会造成一些安全威胁 char *p = malloc(x * y); while (x > 0) while (y > 0) *p++ = 0; 更新: 大多数人似乎评论说,这是一个无限循环,当它在分配的内存上写入时,这个代码段最终会使程序崩溃。 但是除了这个问题。malloc的使用方式是否存在一些问题?例如,由于没有对x和y进行上限检查,因此堆溢出?如果x和y为正,您将无限地写入内存,直到程序退出,这是我所
char *p = malloc(x * y);
while (x > 0)
while (y > 0)
*p++ = 0;
更新:
大多数人似乎评论说,这是一个无限循环,当它在分配的内存上写入时,这个代码段最终会使程序崩溃。
但是除了这个问题。malloc的使用方式是否存在一些问题?例如,由于没有对x和y进行上限检查,因此堆溢出?如果x和y为正,您将无限地写入内存,直到程序退出,这是我所期望的。这不是一个好主意。如果x和y为正,你将无限地写入内存,直到程序退出,这是我所期望的。这不是一个好主意。从可信用户那里接收代码将是一个问题
x
和y
永不更改。假设其中一个为正,while循环将始终计算为相同的值,并导致无限循环。如果两者都为正值,则将继续写入内存,直到程序崩溃
这不是一段好的代码。从受信任的用户那里接收代码将是一个问题
x
和y
永不更改。假设其中一个为正,while循环将始终计算为相同的值,并导致无限循环。如果两者都为正值,则将继续写入内存,直到程序崩溃
这不是一段好的代码。如果
y
和x
大于0
,这将导致未定义的行为,因为您进入无限循环并将0
分配给指向您不拥有的内存的指针。如果y
和x
大于0
,这将导致未定义的行为,因为您进入无限循环,并将0
分配给指向您不拥有的内存的指针。是的,这将写入未分配的内存,并且程序将出错
使用memset如果要清空内存块,原型如下所示:
void * memset(void *dest, int c, size_t count);
char *p = malloc(x * y);
memset(p, 0, x * y);
所以代码看起来像这样:
void * memset(void *dest, int c, size_t count);
char *p = malloc(x * y);
memset(p, 0, x * y);
是的,这将写入未分配的内存,程序将出现故障 使用memset如果要清空内存块,原型如下所示:
void * memset(void *dest, int c, size_t count);
char *p = malloc(x * y);
memset(p, 0, x * y);
所以代码看起来像这样:
void * memset(void *dest, int c, size_t count);
char *p = malloc(x * y);
memset(p, 0, x * y);
我看不到安全威胁。要么得到大于0的值,这将使您处于无限循环中,并覆盖进程的内存,直到出现分段错误,进程死亡。如果其中一个参数为零,则调用
malloc(0)
,这可能会导致内存泄漏
不管怎么说,代码完全是疯了,所以我认为你的问题是学术性的。我看不到安全威胁。要么得到大于0的值,这将使您处于无限循环中,并覆盖进程的内存,直到出现分段错误,进程死亡。如果其中一个参数为零,则调用
malloc(0)
,这可能会导致内存泄漏
不管怎么说,代码是完全疯狂的,所以我认为你的问题是学术性的。正如其他人所指出的,你发布的代码包含一个无限循环。您可能打算执行以下操作:
char *p = malloc( sizeof(x) * x * y );
if( p != NULL ) {
memset( p, 0, sizeof(x) * x * y );
} else {
// error allocating memory, handle it somehow
}
正如其他人指出的,您发布的代码包含一个无限循环。您可能打算执行以下操作:
char *p = malloc( sizeof(x) * x * y );
if( p != NULL ) {
memset( p, 0, sizeof(x) * x * y );
} else {
// error allocating memory, handle it somehow
}
是的,在while循环中存在无限循环,并且可能存在堆栈溢出。 也不确定它将如何构成安全威胁,但它是对系统的潜在威胁,因为它可能导致内存问题。 没有检查“x”和“y”的边界,所以用户可以发送大量数据,您可能会得到分割错误。 malloc返回的地址类型丢失。 另外,编码风格(*p++)让人困惑,因此很难维护这样的代码。
在现实世界中,此代码肯定会使应用程序失败。是的,在while循环中存在无限循环,并且可能存在堆栈溢出。 也不确定它将如何构成安全威胁,但它是对系统的潜在威胁,因为它可能导致内存问题。 没有检查“x”和“y”的边界,所以用户可以发送大量数据,您可能会得到分割错误。 malloc返回的地址类型丢失。 另外,编码风格(*p++)让人困惑,因此很难维护这样的代码。
在现实世界中,此代码肯定会使应用程序失败。这里的一个问题是代码泄漏内存。当它完成执行后,您无法将
p
传递到free
,原始值已丢失。您试图如何处理这些循环?是的,这是不安全的。您需要检查malloc
的返回值。这段代码本身并不安全,因为x和y永远不会更改。另一个更微妙的问题是x*y
可能会溢出,在这种情况下,您可能会分配比您预期的更少的内存。这里的一个问题是代码泄漏内存。当它完成执行后,您无法将p
传递到free
,原始值已丢失。您试图如何处理这些循环?是的,这是不安全的。您需要检查malloc
的返回值。这段代码本身并不安全,因为x和y永远不会更改。另一个更微妙的问题是x*y
可能会溢出,在这种情况下,您可能会分配比您预期的少。每次我看到malloc
和memset
组合时,我想把我的头发扯下来。使用calloc!这一点很好,而且在尝试使用之前检查malloc/calloc的返回也是一件好事。每次我看到malloc
和memset
组合在一起,我都想大发雷霆。使用calloc!这一点很好,在尝试t之前检查malloc/calloc的返回也是一件好事