如果x和y参数从不受信任的用户接收数据,这段代码会造成一些安全威胁吗?
char *p = malloc(x * y);
while (x > 0)
while (y > 0)
*p++ = 0;
更新
大多数人似乎评论说它是一个无限循环,并且当它写入分配的内存时,这个代码段最终会使程序崩溃。 然而除了那个问题。是不是可能有一些关于如何使用malloc的问题?例如。堆溢出,因为没有上限检查x和y?
答案 0 :(得分:6)
如果x和y是正数,你将无限地写入内存直到程序缩小,这是我所期望的。不是个好主意。
答案 1 :(得分:2)
从TRUSTED用户接收该代码将是一个问题。
x
和y
永远不会改变。假设其中一个是正数,则while循环将始终评估为相同的东西,并导致无限循环。如果两者都是正数,那么在程序崩溃之前,你将继续写入内存。
不是一段好的代码。
答案 2 :(得分:2)
如果y
和x
大于0
,则会导致未定义的行为,因为您输入无限循环并将0
分配给指向内存的指针不拥有。
答案 3 :(得分:1)
是的,这将写入未分配的内存,程序将分段。
如果要清空内存块,请使用memset,原型如下所示:
void * memset(void *dest, int c, size_t count);
所以代码看起来像这样:
char *p = malloc(x * y);
memset(p, 0, x * y);
答案 4 :(得分:0)
我没有看到安全威胁。要么得到大于0的值,这将使您进入无限循环并覆盖进程的内存,直到出现分段错误并且您的进程终止。如果其中一个参数为零,则调用malloc(0)
,这可能会导致内存泄漏。
无论如何,代码完全是疯了,所以我认为你的问题是学术性的。
答案 5 :(得分: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
}
答案 6 :(得分:0)
是的,有一个无限循环,在你的while循环中可能存在堆栈溢出。 还不确定它将如何构成安全威胁,但它对系统构成潜在威胁,因为它可能导致内存问题。 没有检查“x”和“y”的边界,因此用户可以发送大量数据,您可能会收到分段错误错误。 malloc返回的地址丢失。 此外,编码风格(* p ++)使人们感到困惑,因此难以维护这样的代码。 这段代码肯定会在现实世界中失败。