C - 重新编码malloc()如何检测调用中使用的负大小?

时间:2015-02-13 13:04:07

标签: c memory-management malloc

我目前正在重新编码malloc()并且需要处理调用者执行缓冲区大小计算导致负值然后传递给malloc()的情况?

我知道参数是size_t,所以我是无符号的int?

这样,我想检查将传递给我重新编码的malloc()的大小,但我该怎么办?

因为如果我传递一个否定参数,它将被改为一个随机数,如18446744073709551613我得到的。

所以我的问题是:当参数为size_t(unsigned int)时,如何检查参数是否为负数,它将直接转换为天文数值,不是吗?

4 个答案:

答案 0 :(得分:2)

void *malloc(size_t size);

如您所见,参数是无符号类型,这意味着您无法传递负值。

无论如何,从积分值到无符号类型的转换被定义为保值模数max_value + 1.

答案 1 :(得分:2)

由于它是无符号数据类型,因此该值不能为负数。

你的问题更多,如果/如何区分有意传递的巨大价值和来自环绕的巨大价值。

一般来说,这是不可能的。

答案 2 :(得分:2)

通常,所有大小计算都是一个好主意,其中使用带符号的数字类型从另一个值中减去一个值,允许检查负值。虽然malloc()的原型要求size_t是无符号值,但您可以传递一个有符号值,编译器将为您进行非常简单的转换。

这是我遵循任何类型的缓冲区大小计算的一般规则。如果使用带符号变量进行计算,则很容易检测到缓冲区大小计算问题。

你写下你的问题“因为如果我传递一个否定参数,它将被改为一个随机数,如18446744073709551613我得到的。”这不是真的。大数字是负值的无符号表示。它不是随机的。

另一种选择是对值进行边界检查。例如,您可以检查size_t的值是否大于0x7ffffff,这是最大的32位有符号值和非常大的缓冲区大小。在我使用的计算机上,表示为unsigned的负值将是一个大于0x8000000的数字。

答案 3 :(得分:1)

是的,你是对的。即使在malloc函数的情况下传递负值,size_t值也始终为正。如果你传递负值,那么这个负值将被转换为size_t类型的无符号值,从而产生一个大的正整数。

示例:

int *p = (int*)malloc(-5);
相当于:

int*p = malloc(SIZE_MAX - 1); // SIZE_MAX是size_t ..!

的最大值