我目前正在重新编码malloc()
,需要处理调用方进行缓冲区大小计算,结果为负值,然后将其传递给malloc()
的情况?
我知道这个参数是一个size_t
,所以我是一个无符号的int,对吗?
通过这种方式,我想检查将传递给我重新编码的malloc()
的大小,但我该怎么办?
因为如果我传递一个负参数,它会变成一个随机数,就像我刚刚得到的18446744073709551613
。
所以我的问题是:当参数是size_t
(无符号int)时,我如何检查参数是否为负数,它将直接转换为天文值,否?
通常,最好使用允许检查负值的带符号数字类型进行所有大小计算,即从另一个值中减去一个值。尽管malloc()
的原型调用了一个size_t,它是一个无符号值,但您可以传递一个有符号值,编译器将为您进行非常简单的转换。
这是我对任何类型的缓冲区大小计算所遵循的一般规则。如果使用带符号的变量进行计算,则很容易检测到缓冲区大小计算问题。
你在问题中写道:"因为如果我传递一个负参数,它就会变成一个随机数,就像我刚刚得到的18446744073709551613
一样。"但这并不是真的。大数字是负值的无符号表示。这不是随机的。
另一种选择是对该值进行边界检查。例如,您可以检查size_t的值是否大于0x7ffffff,这是最大的32位有符号值和非常大的缓冲区大小。在我使用的计算机上,用无符号表示的负值将是一个大于0x8000000的数字。
void *malloc(size_t size);
正如您所看到的,参数是一个无符号类型,这意味着您不能传递负值。
无论如何,从整数值到无符号类型的转换被定义为保持值的模max_value+1。
由于它是无符号数据类型,因此该值不能为负数。
你的问题更多的是,如果/如何区分有意传递的巨大价值和来自包装的巨大价值。
总的来说,这是不可能的。
在malloc函数的情况下,即使传递负值,
size_t
值也始终为正值。如果您传递负值,则该负值将转换为size_t
类型的无符号值,这将导致一个大的正整数。
示例:
int *p = (int*)malloc(-5);
相当于:
int*p = malloc(SIZE_MAX - 1);
//SIZE_MAX是SIZE_t..的最大值。。!