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



我目前正在重新编码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..的最大值。。!

相关内容

  • 没有找到相关文章

最新更新