編碼:
#include <stdio.h>
void Print(char str[100])
{
printf("%s", str);
}
int main(void)
{
Print("A");
}
使用 GCC 11.1 及更高版本編譯時會產生警告
警告:“列印”訪問大小為 2 的區域中的 100 個位元組 [-Wstringop-overflow=]
當我傳遞一個較小的字串時。這沒有啟用任何警告標志。
示例代碼:https ://godbolt.org/z/nWs1PK9Y6
正如您所看到的,其他編譯器對此并不滿意。
我確實找到了一個有相關問題的執行緒,但是關于一個更奇怪的 int 陣列:
GCC 11 在不使用字串操作時給出 -Wstringop-overflow
然而,這絕對是一個錯誤,已得到糾正,并且在樹干尖端版本中不再發生,而在我顯示的代碼中,它在樹干中仍然有相同的警告。
我相信這是另一個錯誤,或者至少是一個不太有用的警告,因為據我所知,該引數將衰減為指標,但我想確認這一點。
正如評論部分所述,這對于警告 API 用戶正在傳遞一個較小的字串作為引數很有用,但這真的有意義嗎,至少在沒有啟用警告標志的情況下顯示它?
在其他情況下,將字串傳遞給更大的陣列是微不足道的。對我來說,如果傳遞的字串大于引數應該采用的值,警告用戶會更有意義,但如果我傳遞的字串大于 100,警告就會消失。
uj5u.com熱心網友回復:
該
-Wstringop-overflow=4選項使用型別三物件大小檢查來確定目標物件的大小。在此設定下,該選項會警告溢位任何資料成員,并且當目標是多個物件之一時,它使用其中最大的物件的大小來決定是否發出警告。-Wstringop-overflow=3與此選項的設定類似,可能會導致良性代碼的警告。
來源:https ://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
如果char str[100]是char str[],則 gcc 會自動將其更改為char *.
-O2可以使用優化標志或來抑制此警告-O3。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/465485.html
