gpt4 book ai didi

c++ - 如果整数溢出, (unsigned int) * (int) 的结果是什么?无符号或整数?

转载 作者:可可西里 更新时间:2023-11-01 17:36:29 26 4
gpt4 key购买 nike

如果整数溢出,(unsigned int) * (int) 的结果是什么? unsigned 还是 int?数组索引运算符 (operator[]) 为 char* 采用什么类型:intunsigned int 或还有别的吗?

我正在审计下面的函数,突然出现了这个问题。该函数在第 17 行存在漏洞。

// Create a character array and initialize it with init[] 
// repeatedly. The size of this character array is specified by
// w*h.
char *function4(unsigned int w, unsigned int h, char *init)
{
char *buf;
int i;

if (w*h > 4096)
return (NULL);

buf = (char *)malloc(4096+1);
if (!buf)
return (NULL);

for (i=0; i<h; i++)
memcpy(&buf[i*w], init, w); // line 17

buf[4096] = '\0';

return buf;
}

请考虑 wh 都是非常大的无符号整数。第 9 行的乘法有机会通过验证。

现在问题出在第17行,int i乘以unsigned int w:如果结果是int,有可能乘积为负,导致访问 buf 之前的位置。如果结果为 unsigned int,则乘积始终为正,从而导致访问 buf 之后的位置。

很难编写代码来证明这一点:int 太大。有人对此有想法吗?

是否有指定产品类型的文档?我已经搜索过了,但到目前为止还没有找到任何东西。

我想就漏洞而言,无论是 (unsigned int) * (int) 产生 unsigned int 还是 int 都没有没关系,因为在编译后的目标文件中,它们只是字节。无论产品类型如何,以下代码的工作原理都是一样的:

unsigned int x = 10;
int y = -10;

printf("%d\n", x * y); // print x * y in signed integer
printf("%u\n", x * y); // print x * y in unsigned integer

因此,乘法返回什么类型并不重要。消费者函数采用 int 还是 unsigned 很重要。

这里的问题不是功能有多差,或者如何改进功能使其变得更好。该功能无疑存在漏洞。问题是关于函数的确切行为,基于标准规定的行为。

最佳答案

在long long中做w*h计算,检查是否大于MAX_UINT

编辑:备选方案:if overflown (w*h)/h != w(总是这样吗?!应该是,对吧?)

关于c++ - 如果整数溢出, (unsigned int) * (int) 的结果是什么?无符号或整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/721861/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com