簡體   English   中英

gcc -Wtype-limits 有上限

[英]gcc -Wtype-limits with upper limits

給出這個片段

#include <inttypes.h>

uint8_t test(uint32_t foo) 
{
    if (foo > 0xFFFFFFFF)
    {
        return 0;
    }
    if (foo < 0)
    {
        return 0;
    }
    return 1;
}

使用 gcc 12.2 使用-Wall -Wextra編譯給出以下警告:

 warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
    9 |     if (foo < 0)
      |             ^

我不明白為什么第一行if (foo > 0xFFFFFFFF)沒有觸發相同的警告。

嘗試if (foo > UINT32_MAX)不會觸發任何編譯器警告。

它是錯誤還是功能?

這些警告不是語言規則強制要求的,是否添加它們取決於編譯器供應商。 gcc警告您有關第二個if的事實可以被視為禮貌。 出於這個原因,我認為我們不能將此視為錯誤,除非您可以在gcc文檔中發現此特定功能,這可能會改變我的觀點。

我檢查了clang是否有這些警告,果然它根本沒有警告你,至少沒有這些標志:

https://godbolt.org/z/c7hbM3K5d

只有當你嘗試-Weverything時,它才會警告你兩種情況:

<source>:5:13: warning: result of comparison 'uint32_t' (aka 'unsigned int') > 4294967295 is always false [-Wtautological-type-limit-compare]
    if (foo > 0xFFFFFFFF)
        ~~~ ^ ~~~~~~~~~~
<source>:9:13: warning: result of comparison of unsigned expression < 0 is always false [-Wtautological-unsigned-zero-compare]
    if (foo < 0)
        ~~~ ^ ~

https://godbolt.org/z/9b9q13rTe

在我的書中為clang +1。

如果你想在你的構建中看到這些警告,一定要使用特定的標志( -Wtautological-unsigned-zero-compare-Wtautological-type-limit-compare ),使用-Weverything會太冗長並且標記許多你不知道的情況'需要如評論中所述。


回到gcc ,如果你使用更寬的類型進行比較,例如if (foo > 0xFFFFFFFF0)那么你會收到警告:

<source>:5:13: warning: comparison is always false due to limited range of data type [-Wtype-limits]
    5 |     if (foo > 0xFFFFFFFF0)
      |             ^

https://godbolt.org/z/Edvz7aq3b

我們可以假設他們忘記包括uint32_t的最大值,這可能是一個錯誤,或者可能是警告實現側重於 types 而不是 values ,我們只能推測。 如果您堅持讓此特定警告對UINT32_MAX ,您可以提交報告,或者至少完成它,並找出導致此行為的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM