繁体   English   中英

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

[英]How to detect negative number assigned to size_t?

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

std::size_t foo = -42;

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

答案不完整:

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

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

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

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

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

此外,对于各种错误条件,使用转换为size_t的负值是相当常见的做法 - 许多系统调用返回成功的无符号( size_toff_t )值或错误的-1(转换为无符号)。 因此,向编译器添加此类警告将导致对现有代码的虚假警告。 POSIX尝试使用ssize_t对此进行ssize_t ,但是如果返回值大于ssize_t的最大签名值, ssize_t中断可能成功的调用。

以下摘录来自私人图书馆。

#include <limits.h>

#if __STDC__ == 1 && __STDC_VERSION__ >= 199901L || \
    defined __GNUC__ || defined _MSC_VER
    /* Has long long. */
    #ifdef __GNUC__
        #define CORE_1ULL __extension__ 1ULL
    #else
        #define CORE_1ULL 1ULL
    #endif
    #define CORE_IS_POS(x) ((x) && ((x) & CORE_1ULL << (sizeof (x)*CHAR_BIT - 1)) == 0)
    #define CORE_IS_NEG(x) (((x) & CORE_1ULL << (sizeof (x)*CHAR_BIT - 1)) != 0)
#else
    #define CORE_IS_POS(x) ((x) && ((x) & 1UL << (sizeof (x)*CHAR_BIT - 1)) == 0)
    #define CORE_IS_NEG(x) (((x) & 1UL << (sizeof (x)*CHAR_BIT - 1)) != 0)
#endif

#define CORE_IS_ZPOS(x) (!(x) || CORE_IS_POS(x))
#define CORE_IS_ZNEG(x) (!(x) || CORE_IS_NEG(x))

这应该适用于所有未签名的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM