簡體   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