如何检测分配给size_t的负数?

Cam*_*une 17 c++ signed size-t

此声明在g ++ -pedantic -Wall(版本4.6.3)中编译时没有警告:

std::size_t foo = -42;
Run Code Online (Sandbox Code Playgroud)

不太明显的伪造是使用size_t参数声明一个函数,并使用负值调用它.这样的功能可以防止无意中的负面论证(看起来像是无数的庸俗,遵守§4.7/ 2)吗?

答案不完整:

只需将size_t更改为(signed)long就会丢弃size_t的语义和其他优点.

将其更改为ssize_t仅仅是POSIX,而不是标准.

将它改为ptrdiff_t是脆弱的,有时会破坏.

测试巨大的值(高位设置等)是任意的.

Chr*_*odd 4

对此发出警告的问题在于,根据标准,这不是未定义的行为。如果将有符号值转换为相同大小(或更大)的无符号类型,则稍后可以将其转换回原始有符号类型的有符号值,并在任何符合标准的编译器上获取原始值1 。

此外,对于各种错误情况,使用转换为 size_t 的负值是相当常见的做法 - 许多系统调用返回无符号 (size_toff_t) 值表示成功,或返回 -1(转换为无符号)表示错误。因此,向编译器添加这样的警告会导致许多现有代码出现虚假警告。POSIX 尝试将其编码为ssize_t,但这会中断可能成功且返回值大于 的最大有符号值的调用ssize_t


1这里的“原始值”实际上意味着“与该有符号类型进行比较时与原始位模式相同的位模式”——可能不会保留填充位,并且如果有符号表示具有冗余编码(例如,-0和 +0 在符号幅度表示中)它可能是“规范化的”