这种使用malloc的方式不安全吗?

这种使用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为正,您将无限地写入内存,直到程序退出,这是我所

如果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的返回也是一件好事