我目前正在重新编码malloc()
并且需要处理调用者执行缓冲区大小计算导致负值然后传递给malloc()
的情况?
我知道参数是size_t
,所以我是无符号的int?
这样,我想检查将传递给我重新编码的malloc()
的大小,但我该怎么办?
因为如果我传递一个否定参数,它将被改为一个随机数,如18446744073709551613
我得到的。
所以我的问题是:当参数为size_t
(unsigned int)时,如何检查参数是否为负数,它将直接转换为天文数值,不是吗?
答案 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 ..!