首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检测分配给size_t的负数?

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

Stack Overflow用户
提问于 2013-03-30 03:22:54
回答 2查看 8K关注 0票数 17

在g++ -pedantic -Wall (版本4.6.3)中编译此声明时不会出现警告:

代码语言:javascript
复制
std::size_t foo = -42;

不太明显的是,使用size_t参数声明一个函数,并使用负值调用它。这样的函数是否可以防止无意中的负面参数(显示为数万分之一,遵守§4.7/2)?

答案不完整:

仅仅将size_t改为(带符号的) long就会放弃size_t的语义和其他优点。

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

将其更改为ptrdiff_t是很脆弱的,有时甚至会损坏。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-30 03:52:38

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

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

票数 3
EN

Stack Overflow用户

发布于 2016-01-19 01:37:11

以下摘录来自一个私有库。

代码语言:javascript
复制
#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))

这应该适用于所有无符号类型。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15710072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档