[英]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.