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

C - Recoding malloc() how to detect a negative size used in the call?

我目前正在重新编码 malloc() 并且需要处理以下情况:调用者进行缓冲区大小计算,结果为负值,然后传递给 malloc() ?

我知道参数是 size_t,所以我是一个 unsigned int 对吗?

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

因为如果我传递一个负参数,它会变成一个随机数,就像我刚得到的18446744073709551613

所以我的问题是:当参数是size_t(unsigned int)时,如何判断参数是否为负数,会直接转换成一个天文数字,不是吗?

void *malloc(size_t size);

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

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

因为是无符号数据类型,所以不能为负数。

你的问题更多,if/how你可以区分有意传递的巨大价值和来自环绕的巨大价值。

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

是的,你是对的。
size_t 值始终为正,即使在 malloc 函数的情况下传递负值也是如此。如果您传递负值,则此负值将转换为 size_t 类型的无符号值,这会导致一个大的正整数。

示例:

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

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

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

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

您在问题中写下 "Because if I pass a negative parameter it will be changed into a random number like 18446744073709551613 I just get.",但事实并非如此。大数是负值的无符号表示。不是随机的。

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