gcc警告選項匯總


轉載鏈接:gcc警告選項匯總_靑い空゛-CSDN博客

參考資料:https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options

請求或取消警告的選項

警告是診斷消息,報告的結構本質上不是錯誤的,但是有風險或表明可能有錯誤。

以下與語言無關的選項不會啟用特定的警告,但會控制GCC生成的診斷類型。
-fsyntax-only
檢查代碼中的語法錯誤,但除此之外不要做任何事情。

-fmax-errors= n
將錯誤消息的最大數量限制為n ,此時GCC會緩存,而不是嘗試繼續處理源代碼。 如果n為0(默認值),則生成的錯誤消息數量不受限制。 如果還指定了-Wfatal-errors ,則重大錯誤優先於此選項。

-w
禁止所有警告消息。

-Werror
使所有的警告進入錯誤。

-Werror=
將指定的警告轉換為錯誤。 附加警告的說明符; 例如-Werror =開關將由-Wswitch控制的警告轉換為錯誤。 此開關采用否定形式,用於否定-針對特定警告的錯誤; 例如-Wno-error =開關使得-wswitch警告不是錯誤,即使在-Werror有效時也是如此。

每個可控警告的警告消息都包含控制警告的選項。 那么該選項可以與-Werror =和-Wno-error =一起使用 ,如上所述。 (可以使用-fno-diagnostics-show-option標志禁用警告消息中的選項打印。)

請注意,指定-Werror = foo會自動隱含-W foo 。 但是, -Wno-error = foo並不意味着什么。

-Wfatal-errors
此選項會導致編譯器在發生第一個錯誤時中止編譯,而不是嘗試繼續並打印更多錯誤消息。

例如,您可以使用以“ -W ”開頭的選項來請求許多特定的警告 - 可以隱式地請求隱式聲明的警告。 這些特定警告選項中的每一個都有一個以“ -Wno- ”開始的否定形式來關閉警告; 例如, -Wno-implicit 。 本手冊僅列出兩種形式中的一種,無論哪種都不是默認值。 有關其他語言特定的選項,還可以參考C ++ Dialect Options和Objective-C以及Objective-C ++ Dialect Options 。

某些選項(如-Wall和-Wextra )會打開其他選項,例如-Wunused ,這可能會啟用其他選項,例如-Wunused-value 。 正面和負面形式的綜合作用是,更具體的選項優先於不特定的選項,與命令行中的位置無關。 對於相同特征的選項,最后一個生效。 通過編譯指示啟用或禁用的選項(請參閱診斷編譯指示 )將起作用,就好像它們出現在命令行末尾一樣。

當請求無法識別的警告選項時(例如-Wunknown-warning ),GCC將發出診斷,指出該選項未被識別。 但是,如果使用-Wno- form,行為會稍有不同:除非正在生成其他診斷,否則不會生成-Wno-unknown-warning診斷。 這允許在舊編譯器中使用新的-Wno-選項,但如果出現問題,編譯器會警告存在無法識別的選項。

-Wpedantic
-pedantic
發布嚴格的ISO C和ISO C ++所要求的所有警告; 拒絕所有使用禁止擴展的程序,以及其他一些不遵循ISO C和ISO C ++的程序。 對於ISO C,遵循由所使用的任何-std選項指定的ISO C標准版本。

有效的ISO C和ISO C ++程序應該在有或沒有這個選項的情況下正確編譯(盡管極少數需要指定所需版本的ISO C的-ansi或-std選項)。 但是,如果沒有這個選項,也支持某些GNU擴展和傳統的C和C ++特性。 有了這個選項,他們被拒絕。

-Wpedantic不會導致使用名稱以“ __ ”開頭和結尾的替代關鍵字的警告消息。 在__extension__之后的表達式中也禁止了迂腐警告。 但是,只有系統頭文件應該使用這些轉義路由; 應用程序應該避免它們。 請參閱備用關鍵字 。

一些用戶嘗試使用-Wantantic來檢查程序是否符合嚴格的ISO C標准。 他們很快就發現它並沒有達到他們想要的水平:它找到了一些非ISO的做法,但不是所有的只有ISO C 需要診斷的那些做法,以及其他一些診斷已經添加了的做法。

報告任何不符合ISO C標准的功能在某些情況下可能會有用,但需要大量額外的工作,並且與-Wantantic完全不同。 我們不打算在不久的將來支持這種功能。

如果用-std指定的標准表示C的GNU擴展方言,如’ gnu90 ‘或’ gnu99 ',則存在相應的基本標准 ,GNU擴展方言所基於的ISO C版本。 -Wpedantic給出的警告在基本標准要求的地方給出。 (這種警告只適用於不在指定的GNU C方言中的功能是沒有意義的,因為根據定義,C的GNU方言包括編譯器支持的所有功能,並且沒有任何可警告的內容。)

-pedantic-errors
在基本標准 (請參閱-Wpedantic )需要診斷時,在編譯時存在未定義行為的某些情況下以及在某些其他情況下不會妨礙編譯符合標准的有效程序的情況下發出錯誤。 這不等於-Werror =迂回 ,因為這個選項啟用了錯誤,而后者沒有啟用,反之亦然。

-Wall
這使得所有關於某些用戶認為可疑的構造的警告都很容易避免(或修改以防止警告),即使與宏結合使用也是如此。 這也啟用了C ++方言選項和Objective-C和Objective-C ++方言選項中描述的一些特定於語言的警告。

-打開以下警告標志:

-Waddress
-Warray-bounds=1 (only with -O2)
-Wbool-compare
-Wbool-operation
-Wc++11-compat -Wc++14-compat
-Wcatch-value (C++ and Objective-C++ only)
-Wchar-subscripts
-Wcomment
-Wduplicate-decl-specifier (C and Objective-C only)
-Wenum-compare (in C/ObjC; this is on by default in C++)
-Wformat
-Wint-in-bool-context
-Wimplicit (C and Objective-C only)
-Wimplicit-int (C and Objective-C only)
-Wimplicit-function-declaration (C and Objective-C only)
-Winit-self (only for C++)
-Wlogical-not-parentheses
-Wmain (only for C/ObjC and unless -ffreestanding)
-Wmaybe-uninitialized
-Wmemset-elt-size
-Wmemset-transposed-args
-Wmisleading-indentation (only for C/C++)
-Wmissing-attributes
-Wmissing-braces (only for C/ObjC)
-Wmultistatement-macros
-Wnarrowing (only for C++)
-Wnonnull
-Wnonnull-compare
-Wopenmp-simd
-Wparentheses
-Wpointer-sign
-Wreorder
-Wrestrict
-Wreturn-type
-Wsequence-point
-Wsign-compare (only in C++)
-Wsizeof-pointer-div
-Wsizeof-pointer-memaccess
-Wstrict-aliasing
-Wstrict-overflow=1
-Wswitch
-Wtautological-compare
-Wtrigraphs
-Wuninitialized
-Wunknown-pragmas
-Wunused-function
-Wunused-label
-Wunused-value
-Wunused-variable
-Wvolatile-register-var
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
請注意,一些警告標志並不是由-Wall隱含的。 其中一些人警告用戶通常不認為有問題的建築,但有時候您可能希望檢查; 其他人警告在某些情況下必要或難以避免的構造,並且沒有簡單的方法來修改代碼來抑制警告。 其中一些由-Wextra啟用,但其中許多必須單獨啟用。

-Wextra
這會啟用一些未由-Wall啟用的額外警告標志。 (此選項過去稱為-W ,舊名稱仍然受支持,但更新的名稱更具描述性。)

-Wclobbered
-Wcast-function-type
-Wempty-body
-Wignored-qualifiers
-Wimplicit-fallthrough=3
-Wmissing-field-initializers
-Wmissing-parameter-type (C only)
-Wold-style-declaration (C only)
-Woverride-init
-Wsign-compare (C only)
-Wtype-limits
-Wuninitialized
-Wshift-negative-value (in C++03 and in C99 and newer)
-Wunused-parameter (only with -Wunused or -Wall)
-Wunused-but-set-parameter (only with -Wunused or -Wall)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
選項-Wextra還會打印以下情況的警告消息:

指針與整數零與< , <= , >或>= 。
(僅限C ++)枚舉器和非枚舉器都出現在條件表達式中。
(僅限C ++)不明確的虛擬基礎。
(僅限C ++)為已聲明為register的數組下標。
(僅限C ++)取得已聲明register的變量的地址。
(僅限C ++)基類不在派生類的復制構造函數中初始化。
-Wchar-subscripts
警告如果數組下標有char類型。 這是錯誤的常見原因,因為程序員經常忘記這種類型是在某些機器上簽名的。 此警告由-Wall啟用。

-Wchkp
警告由指針界限檢查器( -fcheck-pointer-bounds )發現的無效內存訪問。

-Wno-coverage-mismatch
如果使用-fprofile-use選項時反饋配置文件不匹配,則警告 。 如果在使用-fprofile-gen編譯和使用-fprofile-use編譯時源文件發生更改,則具有配置文件反饋的文件可能無法與源文件匹配,並且GCC無法使用配置文件反饋信息。 默認情況下,此警告已啟用並被視為錯誤。 -Wno-coverage-mismatch可用於禁用警告或-Wno-error = coverage-mismatch可用於禁用該錯誤。 禁用此警告的錯誤可能會導致代碼質量不佳,並且僅在非常小的更改情況下才有用,例如修復現有代碼庫的錯誤。 不建議完全禁用該警告。

-Wno-cpp
(僅限於Objective-C,C ++,Objective-C ++和Fortran)

禁止#warning指令發出的警告消息。

-Wdouble-promotion (C, C++, Objective-C and Objective-C++ only)
當float類型的值隱式提升為double時發出警告。 具有32位“單精度”浮點單元的CPU實現float硬件,但在軟件中模擬double精度。 在這樣的機器上,由於軟件仿真所需的開銷,使用double值進行計算要昂貴得多。

使用double意外執行計算很容易,因為浮點文字隱含了double類型。 例如,在:

float area(float radius)
{
return 3.14159 * radius * radius;
}
1
2
3
4
編譯器使用double執行整個計算,因為浮點文字是double 。

-Wduplicate-decl-specifier (C and Objective-C only)
警告如果聲明有重復的const , volatile , restrict或_Atomic說明符。 此警告由-Wall啟用。

-Wformat
-Wformat= n
檢查對printf和scanf等的調用,以確保提供的參數的類型與指定的格式字符串相匹配,並且格式字符串中指定的轉換有意義。 這包括標准函數,以及其他由printf , scanf , strftime和strfmon (X / Open擴展,而不是C標准)系列(或其他特定於目標系列)的格式屬性(請參閱函數屬性 )指定的標准函數。 哪些函數在沒有指定格式屬性的情況下被檢查取決於所選擇的標准版本,並且沒有指定屬性的函數的這些檢查由-freestanding或-fno-builtin禁用。

格式將根據GNU libc版本2.2支持的格式特性進行檢查。 這些包括所有ISO C90和C99功能,以及Single Unix Specification和一些BSD和GNU擴展的功能。 其他庫實現可能不支持所有這些功能; GCC不支持關於超出特定圖書館限制的功能的警告。 但是,如果-Wpedantic與-Wformat 一起使用,則會提供有關格式特征的警告,但不包括在選定的標准版本中(但不包含strfmon格式,因為這些格式不在C標准的任何版本中)。 請參閱控制C語言的選項 。

-Wformat=1
-Wformat
選項-Wformat相當於-Wformat = 1 , -Wno-format相當於-Wformat = 0 。 由於-Wformat還檢查幾個函數的空格式參數, -Wformat也意味着-Wnonnull 。 這種格式檢查級別的某些方面可以通過以下選項禁用: -Wno-format-contains-nul , -Wno-format-extra-args和-Wno-format-zero-length 。 -Wformat由-Wall啟用。

-Wno-format-contains-nul
如果指定了-Wformat ,則不要警告有關包含NUL字節的格式字符串。

-Wno-format-extra-args
如果指定了-Wformat ,則不要警告有關printf或scanf格式函數的過多參數。 C標准指定了這樣的參數被忽略。

如果未使用的參數位於用’ $ '操作數編號規范指定的已使用參數之間,通常仍會給出警告,因為實現無法知道傳遞給va_arg類型以跳過未使用的參數。 但是,在scanf格式的情況下,如果未使用的參數全部是指針,則此選項會抑制警告,因為Single Unix Specification指出允許使用這些未使用的參數。

-Wformat-overflow
-Wformat-overflow= level
警告對可能溢出目標緩沖區的格式化輸入/輸出函數(如sprintf和vsprintf 。 當由格式指令寫入的確切字節數在編譯時無法確定時,它將根據啟發式進行估計,這取決於級別參數和優化。 雖然啟用優化在大多數情況下會提高警告的准確性,但也可能導致誤報。

-Wformat-overflow
-Wformat-overflow=1
-Wformat啟用的-Wformat-overflow的第1級采用了一種保守的方法,只警告最有可能溢出緩沖區的調用。 在此級別,格式化具有未知值的指令的數字參數假定值為1,未知長度的字符串為空。 已知綁定到其類型的子范圍的數字參數,或者其輸出受其指令的精度或有限的字符串文字限制的字符串參數被假定為取值范圍內的值,該范圍導致輸出中的大部分字節。 例如,下面對sprintf的調用被診斷出來,因為即使a和b都等於零,函數附加到目標緩沖區的終止NUL字符( ‘\0’ )也將被寫入其末尾。 將緩沖區的大小增加一個字節足以避免警告,盡管它可能不足以避免溢出。

void f(int a,int b)
{
char buf [13];
sprintf(buf,“a =%i,b =%i \ n”,a,b);
}
1
2
3
4
5
-Wformat-overflow=2
級別2還會警告有關可能溢出目標緩沖區的調用,因為調用的參數長度或幅度足夠大。 在級別2處 ,未知數值參數被假定為具有大於1的精度的帶符號類型的最小可表示值,否則為最大可表示值。 未知的字符串參數的長度不能被假定為由指令的精度,或者它們可能評估的字符串文字的有限集合,或者它們可能指向的字符數組所限定,都假定為1個字符長。

在第2級,上述示例中的調用再次被診斷,但是這次因為使用等於32位的INT_MIN ,第一個%i指令將在目標緩沖區的末尾寫入其一些數字。 為了保證呼叫安全,無論兩個變量的值如何,目標緩沖區的大小必須增加到至少34個字節。 GCC在警告后的信息說明中包含緩沖區的最小大小。

增加目標緩沖區大小的替代方法是限制格式化值的范圍。 字符串參數的最大長度可以通過指定格式指令中的精度來限制。 當格式指令的數值參數可以假定為小於它們類型的精度時,為格式說明符選擇適當的長度修飾符將減少所需的緩沖區大小。 例如,如果上面示例中的a和b可以假定為處於short int類型的精度范圍內,那么使用%hi格式指令或將參數強制轉換為short可將緩沖區的最大所需大小減少到24個字節。

void f(int a,int b)
{
char buf [23];
sprintf(buf,“a =%hi,b =%i \ n”,a,(簡寫)b);
}
1
2
3
4
5
-Wno-format-zero-length
如果指定了-Wformat ,則不要警告有關零長度格式。 C標准規定允許零長度格式。

-Wformat=2
啟用-Wformat加上其他格式檢查。 目前相當於-Wformat -Wformat-nonliteral -Wformat-security-Wformat-y2k 。

-Wformat-nonliteral
如果指定了-Wformat ,則還會警告格式字符串是否不是字符串文字,因此無法檢查,除非格式函數將其格式參數作為va_list 。

-Wformat-security
如果指定了-Wformat ,還會警告使用表示可能的安全問題的格式化函數。 目前,這會警告printf和scanf函數的調用,其中格式字符串不是字符串文字,也沒有格式參數,如printf (foo); 。 如果格式字符串來自不可信輸入且包含’ %n ',則這可能是安全漏洞。 (這是目前W-format-nonliteral提出的警告的一個子集,但將來警告可能會被添加到-Wformat-security中 ,而不包括在-Wformat-nonliteral中 。)

-Wformat-signedness
如果指定了-Wformat ,則還會警告格式字符串是否需要一個無符號參數並且該參數是否有符號,反之亦然。

-Wformat-truncation
-Wformat-truncation= level
警告關於調用可能導致輸出截斷的格式化輸入/輸出函數(如snprintf和vsnprintf警告。 當由格式指令寫入的確切字節數在編譯時無法確定時,它將根據啟發式進行估計,這取決於級別參數和優化。 雖然啟用優化在大多數情況下會提高警告的准確性,但也可能導致誤報。 除非另有說明,該選項使用相同的邏輯 - 格式溢出 。

-Wformat-truncation
-Wformat-truncation=1
-Wformat啟用的-Wformat-truncation的 Level 1采用了一種保守的方法,只警告對有界函數的調用,該函數的返回值未使用,並且很可能導致輸出截斷。

-Wformat-truncation=2
級別2還警告對使用返回值的有界函數的調用,並且在給定足夠長度或幅度的參數時可能導致截斷。

-Wformat-y2k
如果指定了-Wformat ,還會警告有關可能只產生兩位數年份的strftime格式。

-Wnonnull
警告標記為非空值函數屬性的參數需要傳遞空指針。

-Wnonnull包含在-Wall和-Wformat中 。 它可以通過-Wno-nonnull選項禁用。

-Wnonnull-compare
在比較標記nonnull空函數屬性的參數與函數內的空值時發出警告。

-Wnonnull-compare包含在-Wall中 。 它可以通過-Wno-nonnull-compare選項禁用。

-Wnull-dereference
如果編譯器檢測到由於取消引用空指針而導致觸發錯誤或未定義行為的路徑,則發出警告。 該選項僅在-fdelete-null-pointer-checks處於活動狀態時才有效,這是通過大多數目標中的優化啟用的。 警告的精度取決於所使用的優化選項。

-Winit-self (C, C++, Objective-C and Objective-C++ only)
警告使用自己初始化的未初始化變量。 請注意,此選項只能與-Wuninitialized選項一起使用。

例如,只有在指定-Winit-self時,GCC才會在下面的代碼片段中提醒i未初始化:

int f()
{
int i = i;
回報我;
}
1
2
3
4
5
此警告由C ++中的-Wall啟用。

-Wimplicit-int (C and Objective-C only)
當聲明沒有指定類型時發出警告。 此警告由-Wall啟用。

-Wimplicit-function-declaration (C and Objective-C only)
在聲明之前使用函數時發出警告。 在C99模式下( -std = c99或-std = gnu99 ),默認情況下會啟用此警告,並通過-pedantic-errors將其設置為錯誤 。 此警告也由-Wall啟用。

-Wimplicit (C and Objective-C only)
與-Wimplicit-int和-Wimplicit-function-declaration相同 。 此警告由-Wall啟用。

-Wimplicit-fallthrough
-Wimplicit- fallthrough與-Wimplicit- fallthrough = 3相同 , -Wno-implicit-fallthrough與-Wimplicit- fallthrough = 0相同 。

-Wimplicit-fallthrough= n
當開關盒跌落時發出警告。 例如:

switch (cond)
{
case 1:
a = 1;
break;
case 2:
a = 2;
case 3:
a = 3;
break;
}
1
2
3
4
5
6
7
8
9
10
11
當警告的最后一個語句不能通過時,例如當有一個返回語句或對noreturn屬性聲明的函數調用時,此警告不會警告。 -Wimplicit-fallthrough =也考慮到了控制流程語句,比如ifs,並且只在適當的時候發出警告。 例如

switch (cond)
{
case 1:
if (i > 3) {
bar (5);
break;
} else if (i < 1) {
bar (0);
} else
return;
default:

}
1
2
3
4
5
6
7
8
9
10
11
12
13
由於在某些情況下可能會出現切換情況,GCC提供了一個屬性__attribute__ ((fallthrough)) ,該屬性將與空語句一起使用來抑制通常會發生的警告:

switch (cond)
{
case 1:
bar (0);
__attribute__ ((fallthrough));
default:

}
1
2
3
4
5
6
7
8
C ++ 17提供了一種標准的方法來抑制使用[[fallthrough]];的-Wimplicit-Fallthrough警告[[fallthrough]]; 而不是GNU屬性。 在C ++ 11或C ++ 14中,用戶可以使用[[gnu::fallthrough]]; ,這是一個GNU擴展。 除了這些屬性外,還可以添加一條跌落評論以使警告消失。 C或C ++樣式注釋的整個主體應該與下面列出的給定正則表達式匹配。 選項參數n指定接受哪種注釋:

-Wimplicit-Fallthrough = 0完全禁用警告。
-Wimplicit-fallthrough = 1匹配.正則表達式,任何評論都被用作fallthrough評論。
-wimplicit-fallthrough = 2 case nonnsitively matches .falls?[ \t-]thr(ough|u).正則表達式。
-Wimplicit-fallthrough = 3大小寫敏感地匹配以下正則表達式之一:
-fallthrough
@fallthrough@
lint -fallthrough[ \t]
[ \t.!](ELSE,? |INTENTIONAL(LY)? )?
FALL(S | |-)?THR(OUGH|U)[ \t.!](-[^\n\r])?
[ \t.!](Else,? |Intentional(ly)? )?
Fall((s | |-)[Tt]|t)hr(ough|u)[ \t.!](-[^\n\r])?
[ \t.!]([Ee]lse,? |[Ii]ntentional(ly)? )?
fall(s | |-)?thr(ough|u)[ \t.!](-[^\n\r])?
-Wimplicit-fallthrough = 4大小寫敏感地匹配以下正則表達式之一:
-fallthrough
@fallthrough@
lint -fallthrough[ \t]*
[ \t]FALLTHR(OUGH|U)[ \t]
-Wimplicit-Fallthrough = 5不會將任何注釋識別為傳遞注釋,只有屬性禁用警告。
注釋需要在可選空白和其他注釋之后遵循case或default關鍵字或者某個case或default標簽之前的用戶標簽。

switch (cond)
{
case 1:
bar (0);
/* FALLTHRU */
default:

}
1
2
3
4
5
6
7
8
-Wimplicit-Fallthrough = 3警告由-Wextra啟用。

-Wif-not-aligned (C, C++, Objective-C and Objective-C++ only)
控制是否應發出由warn_if_not_aligned屬性觸發的警告。 這是默認啟用的。 使用-Wno-if-not-aligned來禁用它。

-Wignored-qualifiers (C and C++ only)
如果函數的返回類型具有類型限定符(如const ,則發出警告。 對於ISO C這樣的類型限定符沒有效果,因為函數返回的值不是左值。 對於C ++來說,警告只是針對標量類型或void發出的。 ISO C禁止在函數定義上使用合格的void返回類型,所以這種返回類型總是會在沒有這個選項的情況下收到警告。

此警告也由-Wextra啟用。

-Wignored-attributes (C and C++ only)
當屬性被忽略時發出警告。 這與-Wattributes選項不同,它會在編譯器決定刪除屬性時發出警告,而不是該屬性未知,在錯誤的地方使用等。此警告默認情況下處於啟用狀態。

-Wmain
如果main類型可疑,則發出警告。 main應該是一個具有外部鏈接的函數,返回int,可以使用零參數,兩個或三個適當類型的參數。 此警告在C ++中是默認啟用的,可以通過-Wall或-Wpedantic來啟用。

-Wmisleading-indentation (C and C++ only)
當代碼的縮進不反映塊結構時發出警告。 具體而言,針對if , else , while和for子句發出警告,其中警告語句不使用大括號,后跟具有相同縮進的未保護語句。

在下面的例子中,對“bar”的調用被誤導地縮進,就好像它受到“if”條件的保護。

if(some_condition())
foo();
bar(); /* Gotcha: this is not guarded by the "if". */
1
2
3
在混合制表符和空格的情況下,警告使用-ftabstop =選項來確定語句是否排隊(默認為8)。

對於涉及多行預處理器邏輯的代碼(如以下示例),不會發出該警告。

if (flagA)
foo (0);
#if SOME_CONDITION_THAT_DOES_NOT_HOLD
if (flagB)
#endif
foo (1);
1
2
3
4
5
6
該警告不會在#line指令之后發出,因為這通常會指示自動生成的代碼,並且不會假定該指令所引用的文件的布局。

此警告是由C和C ++中的-Wall啟用的。

-Wmissing-attributes
當函數聲明缺少一個或多個屬性時,警告聲明相關函數,並且其缺少可能會對生成的代碼的正確性或效率產生負面影響。 例如,在C ++中,當使用屬性alloc_align , assume_aligned , assume_aligned , format , format_arg , malloc或assume_aligned聲明的主模板的顯式特化未聲明時,會發出警告。 deprecated屬性, error和warning抑制警告。 (請參閱功能屬性 )。

-Wmissing-attributes由-Wall啟用。

例如,由於下面的主要函數模板的聲明使用屬性malloc和alloc_size ,因此模板的顯式特化的聲明被診斷,因為它缺少其中一個屬性。

template <class T>
T* __attribute__ ((malloc, alloc_size (1)))
allocate (size_t);

template <>
void* __attribute__ ((malloc)) // missing alloc_size
allocate<void> (size_t);
1
2
3
4
5
6
7
-Wmissing-braces
如果聚合或聯合初始值設定項沒有完全包圍,則發出警告。 在以下示例中,a的初始值設定項未完全包圍,但b的完全包圍。 此警告由C中的-Wall啟用

int a [2] [2] = {0,1,2,3};
int b [2] [2] = {{0,1},{2,3}};
1
2
此警告由-Wall啟用。

-Wmissing-include-dirs (C, C++, Objective-C and Objective-C++ only)
如果用戶提供的包含目錄不存在,則發出警告。

-Wmultistatement-macros
警告不安全的多語句宏,這些宏看起來像if , else , for , switch或while這樣的子句可以保護,其中只有第一條語句在擴展宏后才實際被保護。

例如:

#define DOIT x++; y++
if (c)
DOIT;
1
2
3
將無條件地增加y ,而不僅僅是當c成立時。 通常可以通過將宏包裝在do-while循環中來解決該問題:

#define DOIT do { x++; y++; } while (0)
if (c)
DOIT;
1
2
3
此警告是由C和C ++中的-Wall啟用的。

-Wparentheses
如果在某些上下文中省略了括號,例如當預期有真值的上下文中存在賦值時,或者運算符嵌套,其優先級人員經常會感到困惑時,會發出警告。

還會發出如x<=y<=z等比較結果的警告。 這相當於(x<=y ? 1 : 0) <= z ,這是與普通數學符號的解釋不同的解釋。

還警告GNU擴展的危險用途?:省略中間操作數。 當條件在? :運算符是一個布爾表達式,省略的值始終為1.程序員通常希望它是在條件表達式內計算的值。

對於C ++,這也會在聲明中警告一些不必要的括號,這可能表示試圖在函數調用而不是聲明:

{
// Declares a local variable called mymutex.
std::unique_lock<std::mutex> (mymutex);
// User meant std::unique_lock<std::mutex> lock (mymutex);
}
1
2
3
4
5
此警告由-Wall啟用。

-Wsequence-point
由於違反了C和C ++標准中的順序點規則,因此可能會有未定義語義的代碼發出警告。

C和C ++標准定義了C / C ++程序中的表達式按順序點進行評估的順序 , 順序點表示執行程序各部分之間的部分順序:在順序點之前執行的順序點和在執行之后執行的順序點它。 這些發生在對一個&& , ||的第一個操作數進行評估之后,對一個完整表達式(不是更大表達式的一部分)進行評估之后。 , ? : ? :或(逗號)運算符,然后調用一個函數(但在其參數和表達被調用函數的表達式之后)以及某些其他地方。 除了順序點規則所表達的內容之外,沒有指定表達式的子表達式的評估順序。 所有這些規則只描述部分順序而不是全部順序,例如,如果在一個表達式中調用了兩個函數,而它們之間沒有順序點,則函數被調用的順序未被指定。 但是,標准委員會已經裁定函數調用不重疊。

在序列點之間不會指定對對象值的修改生效。 行為依賴於此的程序具有未定義的行為; C和C ++標准規定:“在前一個和下一個序列點之間,一個對象最多應該通過評估一個表達式修改其存儲值。 此外,先前值只能讀取,以確定要存儲的值。“ 如果一個程序違反了這些規則,任何特定實現的結果都是完全不可預測的。

具有未定義行為的代碼示例是a = a++; , a[n] = b[n++]和a[i++] = i; 。 一些更復雜的病例不會被這個選項診斷出來,它可能會偶爾出現假陽性結果,但總的來說,在檢測程序中的這類問題時發現它相當有效。

C ++ 17標准將在更多情況下定義操作數的評估順序:特別是它要求在左側之前評估賦值的右側,所以上面的例子不再是未定義的。 但是這個警告仍然會警告他們,幫助人們避免編寫C語言和早期C ++版本中未定義的代碼。

這個標准的措辭令人困惑,因此在微妙的情況下,對序列點規則的確切含義存在一些爭議。 有關問題討論的鏈接,包括提出的正式定義,可以在GCC的閱讀頁面上找到, 網址為http://gcc.gnu.org/readings.html 。

對於C和C ++,此警告由-Wall啟用。

-Wno-return-local-addr
不要警告在函數返回后將指針(或C ++,引用)返回到超出范圍的變量。

-Wreturn-type
每當使用默認為int的返回類型定義函數時發出警告。 還會在返回類型不為void的函數中返回沒有返回值的return語句(從函數體的末尾落下被認為沒有值返回)。

僅對於C,在函數的返回類型為void ,使用表達式的return語句發出警告,除非表達式類型也為void 。 作為GNU擴展,除非使用-Wantantic,否則后一種情況會被接受而不會有警告。

對於C ++,即使指定了-Wno-return-type ,沒有返回類型的函數也會生成診斷消息。 唯一的例外是在系統頭文件中定義的main和函數。

此警告由-Wall啟用。

-Wshift-count-negative
如果移位計數為負,則發出警告。 該警告默認啟用。

-Wshift-count-overflow
如果移位計數> =類型的寬度,則發出警告。 該警告默認啟用。

-Wshift-negative-value
警告如果左移一個負值。 -Wextra在C99和C ++ 11模式(和更新版本)中啟用此警告。

-Wshift-overflow
-Wshift-overflow= n
警告左移溢出。 此警告在C99和C ++ 11模式(及更新版本)中默認啟用。

-Wshift-overflow=1
這是-Wshift-overflow的警告級別,並且在C99和C ++ 11模式(和更新版本)中默認啟用。 此警告級別不警告將左移1到符號位。 (但是,在C語言中,在需要整型常量表達式的上下文中仍會拒絕這樣的溢出。)

-Wshift-overflow=2
除非C ++ 14模式處於活動狀態,否則此警告級別還會警告左移符號位1。

-Wswitch
如果switch語句具有枚舉類型的索引並且缺少該枚舉的一個或多個指定代碼的case ,則發出警告。(default標簽的存在會阻止此警告。)case使用此選項時(即使有default標簽),枚舉范圍外的標簽也會引發警告。此警告由啟用-Wall 。

-Wswitch-default
每當switch陳述沒有default案件時警告。

-Wswitch-enum
每當switch語句具有枚舉類型的索引並且缺少該枚舉case的一個或多個指定代碼時發出警告。case枚舉范圍外的標簽在使用此選項時也會引發警告。唯一的區別-Wswitch此選項是即使存在default標簽,此選項也會提供有關省略的枚舉代碼的警告。

-Wswitch-bool
只要switch語句具有布爾類型的索引並且大小寫值超出布爾類型的范圍,就會發出警告。可以通過將控制表達式轉換為除以外的類型來抑制此警告bool。例如:

switch ((int) (a == 4))
{

}
1
2
3
4
C和C ++程序默認啟用此警告。

-Wswitch-unreachable
只要switch語句包含控制表達式和第一個case標簽之間的語句,即永遠不會執行的語句,就會發出警告。例如:

switch (cond)
{
i = 15;

case 5:

}
1
2
3
4
5
6
7
-Wswitch不可達 如果控件表達式和第一個case標簽之間的聲明只是一個聲明,則不會發出警告:

switch (cond)
{
int i;

case 5:
i = 5;

}
1
2
3
4
5
6
7
8
C和C ++程序默認啟用此警告。

-Wsync-nand (C and C++ only)
當警告__sync_fetch_and_nand和__sync_nand_and_fetch使用的內置功能。這些函數改變了GCC 4.4中的語義。

-Wunused-but-set-parameter
每當一個函數參數被賦值時發出警告,但是除此之外不用(除了聲明)。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

此警告也由啟用 -Wunused 和…一起 -Wextra 。

-Wunused-but-set-variable
每當一個局部變量被分配時發出警告,但在其他情況下不用(除了聲明)。此警告由啟用-Wall 。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

此警告也由啟用 -Wunused ,這是啟用的 -Wall 。

-Wunused-function
每當聲明靜態函數但未定義或未使用非內聯靜態函數時發出警告。此警告由啟用-Wall 。

-Wunused-label
只要標簽被聲明但未被使用,就會發出警告。此警告由啟用-Wall 。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

-Wunused-local-typedefs (C, Objective-C, C++ and Objective-C++ only)
當沒有使用在函數中本地定義的typedef時發出警告。此警告由啟用-Wall 。

-Wunused-parameter
除了聲明之外,只要函數參數沒有被使用,就會發出警告。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

-Wno-unused-result
不要警告標記了屬性的函數的調用者是否使用它的返回值warn_unused_result(請參閱函數屬性)。默認是-Wunused-結果 。

-Wunused-variable
只要本地或靜態變量不在聲明中使用,就會發出警告。這個選項意味着-Wunused const的變量= 1為C,但不適用於C ++。此警告由啟用-Wall 。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

-Wunused-const-variable
-Wunused-const-variable= n
警告只要一個常量靜態變量不用於聲明就可以使用。 -Wunused const的變量= 1 由…啟用 -Wunused可變為C,但不適用於C ++。在C中聲明了變量存儲,但在C ++中,這不是一個錯誤,因為const變量取代了#defines。

要抑制此警告,請使用該unused屬性(請參閱變量屬性)。

-Wunused-const-variable=1
這是由啟用的警告級別 -Wunused可變 它只針對主編譯單元中定義的未使用的靜態常量變量發出警告,但不包括有關任何頭中聲明的靜態常量變量。

-Wunused-const-variable=2
此警告級別還警告標題中的未使用的常量靜態變量(不包括系統標題)。這是警告級別-Wunused const的可變 並且必須明確要求,因為在C ++中這不是錯誤,而在C中可能很難清理包含的所有頭文件。

-Wunused-value
當語句計算明確未使用的結果時發出警告。要抑制此警告,請將未使用的表達式轉換為void。這包括表達式語句或不包含副作用的逗號表達式的左側。例如,表達式x[i,j]會導致警告,但x[(void)i,j]不會。

此警告由啟用 -Wall 。

-Wunused
All the above -Wunused options combined.

In order to get a warning about an unused function parameter, you must either specify -Wextra -Wunused (note that -Wall implies -Wunused ), or separately specify -Wunused-parameter .

-Wuninitialized
Warn if an automatic variable is used without first being initialized or if a variable may be clobbered by a setjmp call. In C++, warn if a non-static reference or non-static const member appears in a class without constructors.

If you want to warn about code that uses the uninitialized value of the variable in its own initializer, use the -Winit-self option.

These warnings occur for individual uninitialized or clobbered elements of structure, union or array variables as well as for variables that are uninitialized or clobbered as a whole. They do not occur for variables or elements declared volatile . Because these warnings depend on optimization, the exact variables or elements for which there are warnings depends on the precise optimization options and version of GCC used.

Note that there may be no warning about a variable that is used only to compute a value that itself is never used, because such computations may be deleted by data flow analysis before the warnings are printed.

-Winvalid-memory-model
Warn for invocations of __atomic Builtins , __sync Builtins , and the C11 atomic generic functions with a memory consistency argument that is either invalid for the operation or outside the range of values of the memory_order enumeration. For example, since the __atomic_store and __atomic_store_n built-ins are only defined for the relaxed, release, and sequentially consistent memory orders the following code is diagnosed:

void store (int *i)
{
__atomic_store_n (i, 0, memory_order_consume);
}
1
2
3
4
-Winvalid-memory-model is enabled by default.

-Wmaybe-uninitialized
對於自動(即局部)變量,如果存在從函數入口到被初始化的變量的使用的路徑,但是存在其他變量未初始化的其他路徑,則編譯器在不能初始化的情況下發出警告證明在運行時未執行未初始化的路徑。

這些警告只能在優化編譯時使用,否則GCC不會跟蹤變量的狀態。

這些警告是可選的,因為即使出現錯誤,GCC也可能無法確定代碼何時正確。以下是可能發生的一個例子:

{
int x;
switch (y)
{
case 1: x = 1;
break;
case 2: x = 4;
break;
case 3: x = 5;
}
foo (x);
}
1
2
3
4
5
6
7
8
9
10
11
12
如果值y始終為1,2或3,則x始終進行初始化,但GCC不知道這一點。要取消警告,您需要提供一個默認情況下的斷言(0)或類似的代碼。

此選項還會在非易失性自動變量被呼叫更改時發出警告longjmp。編譯器只能看到呼叫setjmp。它不知道哪里longjmp會叫; 實際上,信號處理程序可以在代碼中的任何位置調用它。因此,即使實際上沒有問題,您也可能會收到警告,因為longjmp實際上不會在會導致問題的地方調用。

如果您聲明所有永遠不會返回的函數,則可以避免一些虛假警告noreturn。請參閱功能屬性。

此警告由啟用 -Wall 要么 -Wextra 。

-Wunknown-pragmas

pragma遇到GCC無法理解的指令時發出警告。如果使用此命令行選項,則甚至會為系統頭文件中的未知編譯指示發出警告。如果只有警告才被啟用,情況並非如此-Wall 命令行選項。

-Wno-pragmas
不要警告有關編譯指示的誤用,例如參數不正確,語法無效或編譯指示沖突。也可以看看-Wunknown的編譯指示 。

-Wstrict-aliasing
該選項僅在激活時才有效 -fstrict走樣活躍。它警告可能會破壞編譯器用於優化的嚴格別名規則的代碼。警告並沒有涵蓋所有情況,但確實試圖抓住更常見的陷阱。它包含在中-Wall。這相當於-Wstrict-aliasing=3.

-Wstrict-aliasing=n
該選項僅在激活時才有效 -fstrict走樣 is active. It warns about code that might break the strict aliasing rules that the compiler is using for optimization. Higher levels correspond to higher accuracy (fewer false positives). Higher levels also correspond to more effort, similar to the way -O works. -Wstrict-aliasing is equivalent to -Wstrict-aliasing=3 .

Level 1: Most aggressive, quick, least accurate. Possibly useful when higher levels do not warn but -fstrict-aliasing still breaks the code, as it has very few false negatives. However, it has many false positives. Warns for all pointer conversions between possibly incompatible types, even if never dereferenced. Runs in the front end only.

Level 2: Aggressive, quick, not too precise. May still have many false positives (not as many as level 1 though), and few false negatives (but possibly more than level 1). Unlike level 1, it only warns when an address is taken. Warns about incomplete types. Runs in the front end only.

Level 3 (default for -Wstrict-aliasing ): Should have very few false positives and few false negatives. Slightly slower than levels 1 or 2 when optimization is enabled. Takes care of the common pun+dereference pattern in the front end: (int)&some_float . If optimization is enabled, it also runs in the back end, where it deals with multiple statement cases using flow-sensitive points-to information. Only warns when the converted pointer is dereferenced. Does not warn about incomplete types.

-Wstrict-overflow
-Wstrict-overflow= n
This option is only active when signed overflow is undefined. It warns about cases where the compiler optimizes based on the assumption that signed overflow does not occur. Note that it does not warn about all cases where the code might overflow: it only warns about cases where the compiler implements some optimization. Thus this warning depends on the optimization level.

An optimization that assumes that signed overflow does not occur is perfectly safe if the values of the variables involved are such that overflow never does, in fact, occur. Therefore this warning can easily give a false positive: a warning about code that is not actually a problem. To help focus on important issues, several warning levels are defined. No warnings are issued for the use of undefined signed overflow when estimating how many iterations a loop requires, in particular when determining whether a loop will be executed at all.

-Wstrict-overflow=1
Warn about cases that are both questionable and easy to avoid. For example the compiler simplifies x + 1 > x to 1 . This level of -Wstrict-overflow is enabled by -Wall ; higher levels are not, and must be explicitly requested.

-Wstrict-overflow=2
Also warn about other cases where a comparison is simplified to a constant. For example: abs (x) >= 0 . This can only be simplified when signed integer overflow is undefined, because abs (INT_MIN) overflows to INT_MIN , which is less than zero. -Wstrict-overflow (with no level) is the same as -Wstrict-overflow=2 .

-Wstrict-overflow=3
Also warn about other cases where a comparison is simplified. For example: x + 1 > 1 is simplified to x > 0 .

-Wstrict-overflow=4
Also warn about other simplifications not covered by the above cases. For example: (x * 10) / 5 is simplified to x * 2 .

-Wstrict-overflow=5
Also warn about cases where the compiler reduces the magnitude of a constant involved in a comparison. For example: x + 2 > y is simplified to x + 1 >= y . This is reported only at the highest warning level because this simplification applies to many comparisons, so this warning level gives a very large number of false positives.

-Wstringop-overflow
-Wstringop-overflow= type
Warn for calls to string manipulation functions such as memcpy and strcpy that are determined to overflow the destination buffer. The optional argument is one greater than the type of Object Size Checking to perform to determine the size of the destination. See Object Size Checking . The argument is meaningful only for functions that operate on character arrays but not for raw memory functions like memcpy which always make use of Object Size type-0. The option also warns for calls that specify a size in excess of the largest possible object or at most SIZE_MAX / 2 bytes. The option produces the best results with optimization enabled but can detect a small subset of simple buffer overflows even without optimization in calls to the GCC built-in functions like __builtin_memcpy that correspond to the standard functions. In any case, the option warns about just a subset of buffer overflows detected by the corresponding overflow checking built-ins. For example, the option will issue a warning for the strcpy call below because it copies at least 5 characters (the string “blue” including the terminating NUL) into the buffer of size 4.

enum Color { blue, purple, yellow };
const char* f (enum Color clr)
{
static char buf [4];
const char *str;
switch (clr)
{
case blue: str = "blue"; break;
case purple: str = "purple"; break;
case yellow: str = "yellow"; break;
}

return strcpy (buf, str); // warning here
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Option -Wstringop-overflow=2 is enabled by default.

-Wstringop-overflow
-Wstringop-overflow=1
The -Wstringop-overflow=1 option uses type-zero Object Size Checking to determine the sizes of destination objects. This is the default setting of the option. At this setting the option will not warn for writes past the end of subobjects of larger objects accessed by pointers unless the size of the largest surrounding object is known. When the destination may be one of several objects it is assumed to be the largest one of them. On Linux systems, when optimization is enabled at this setting the option warns for the same code as when the _FORTIFY_SOURCE macro is defined to a non-zero value.

-Wstringop-overflow=2
The -Wstringop-overflow=2 option uses type-one Object Size Checking to determine the sizes of destination objects. At this setting the option will warn about overflows when writing to members of the largest complete objects whose exact size is known. It will, however, not warn for excessive writes to the same members of unknown objects referenced by pointers since they may point to arrays containing unknown numbers of elements.

-Wstringop-overflow=3
The -Wstringop-overflow=3 option uses type-two Object Size Checking to determine the sizes of destination objects. At this setting the option warns about overflowing the smallest object or data member. This is the most restrictive setting of the option that may result in warnings for safe code.

-Wstringop-overflow=4
The -Wstringop-overflow=4 option uses type-three Object Size Checking to determine the sizes of destination objects. At this setting the option will warn about overflowing any data members, and when the destination is one of several objects it uses the size of the largest of them to decide whether to issue a warning. Similarly to -Wstringop-overflow=3 this setting of the option may result in warnings for benign code.

-Wstringop-truncation
Warn for calls to bounded string manipulation functions such as strncat , strncpy , and stpncpy that may either truncate the copied string or leave the destination unchanged.

In the following example, the call to strncat specifies a bound that is less than the length of the source string. As a result, the copy of the source will be truncated and so the call is diagnosed. To avoid the warning use bufsize - strlen (buf) - 1) as the bound.

void append (char *buf, size_t bufsize)
{
strncat (buf, ".txt", 3);
}
1
2
3
4
As another example, the following call to strncpy results in copying to d just the characters preceding the terminating NUL, without appending the NUL to the end. Assuming the result of strncpy is necessarily a NUL-terminated string is a common mistake, and so the call is diagnosed. To avoid the warning when the result is not expected to be NUL-terminated, call memcpy instead.

void copy (char *d, const char *s)
{
strncpy (d, s, strlen (s));
}
1
2
3
4
In the following example, the call to strncpy specifies the size of the destination buffer as the bound. If the length of the source string is equal to or greater than this size the result of the copy will not be NUL-terminated. Therefore, the call is also diagnosed. To avoid the warning, specify sizeof buf - 1 as the bound and set the last element of the buffer to NUL .

void copy (const char *s)
{
char buf[80];
strncpy (buf, s, sizeof buf);
...
}
1
2
3
4
5
6
在字符數組旨在存儲字節序列且不終止NUL的情況下,可以使用屬性nonstring對其進行注釋以避免此警告。但是,這樣的數組對於期望NUL終止字符串的函數不適合。為了幫助檢測這種陣列的意外濫用,GCC發出警告,除非它能證明使用是安全的。請參閱常用變量屬性。

-Wsuggest-attribute= [ pure | const | noreturn | format | cold | malloc ]
警告添加屬性可能會有好處的情況。下面列出了當前支持的屬性。

-Wsuggest-attribute=pure
-Wsuggest-attribute=const
-Wsuggest-attribute=noreturn
-Wsuggest-attribute=malloc
發出警告的功能,可能是屬性候選人pure,const或noreturn或malloc。編譯器只警告在其他編譯單元或(在的情況下,可見功能pure和const),如果它不能證明該功能正常返回。如果函數不包含無限循環或通過拋出,調用abort或陷印異常返回,函數將正常返回。該分析需要選項-fipa純const的 ,這在默認情況下是啟用的 -O和更高。更高的優化級別可以提高分析的准確性。

-Wsuggest-attribute=format
-Wmissing-format-attribute
警告可能是format屬性候選的函數指針。請注意,這些只是可能的候選人,而不是絕對的。 GCC猜測具有format賦值,初始化,參數傳遞或返回語句中使用的屬性的函數指針format在結果類型中應該具有相應的屬性。即分配或初始化的左側,參數變量的類型或包含函數的返回類型應分別具有一個format屬性以避免警告。

海灣合作委員會也警告可能是format屬性候選的函數定義。再次,這些只是可能的候選人。GCC猜測format屬性可能適用於任何調用類似vprintfor 的函數vscanf,但這可能不總是這種情況,並且format可能不會檢測到屬性適當的某些函數。

-Wsuggest-attribute=cold
警告可能是cold屬性候選項的函數。這是基於靜態檢測的,一般只會警告那些總是會導致調用另一個cold函數的函數,比如C ++的包裝器throw或致命的錯誤報告函數abort。

-Wsuggest-final-types
如果類型是用C ++ 11 final說明符聲明的,或者如果可能的話,聲明在匿名名稱空間中,則可通過虛擬方法警告代碼質量將得到改進的類型。這允許GCC更積極地虛擬化多態呼叫。鏈接時間優化時,此警告更有效,其中關於類層次結構圖的信息更加完整。

-Wsuggest-final-methods
如果方法是用C ++ 11 final說明符聲明的,或者如果可能的話,它的類型是在匿名名稱空間或說明final符中聲明的,則會警告虛擬方法的代碼質量會提高。對於鏈接時優化,此警告更有效,其中關於類層次結構圖的信息更加完整。建議首先考慮建議-Wsuggest決賽類型 然后用新的注釋重建。

-Wsuggest-override
警告重寫未使用override關鍵字標記的虛擬函數。

-Walloc-zero
警告調用飾屬性分配函數alloc_size指定零個字節,包括那些功能內置形式aligned_alloc,alloca,calloc,malloc,和realloc。由於這些函數在零大小調用時的行為在不同實現中(並且在realloc已被棄用的情況下)有所不同,因此依賴它可能會導致巧妙的可移植性錯誤,因此應該避免。

-Walloc-size-larger-than= n
警告關於對使用屬性裝飾的函數的調用,alloc_size該屬性嘗試分配大於指定字節數的對象,或者以無限精度的整數類型的大小計算結果超過該值SIZE_MAX / 2。在選項參數Ñ可以在標准后綴指定字節的倍數中的一個端部如kB和KiB為千字節和kibibyte分別MB和MiB為兆字節和mebibyte,等等。請參閱功能屬性。

-Walloca
此選項會警告alloca源中的所有用途。

-Walloca-larger-than= n
此選項會對調用發出警告,該調用alloca不受限制其整數類型參數為最多n個字節的控制謂詞限制,或者調用alloca限制未知的位置。非整數類型的參數被認為是無界限的,即使它們似乎受限於預期的范圍。

例如,一個有界的情況alloca可能是:

void func (size_t n)
{
void *p;
if (n <= 1000)
p = alloca (n);
else
p = malloc (n);
f (p);
}
1
2
3
4
5
6
7
8
9
在上面的示例中,傳遞-Walloca-larger-than=1000不會發出警告,因為調用alloca已知最多為1000個字節。但是,如果-Walloca-larger-than=500通過,編譯器會發出警告。

另一方面,無界用途是alloca沒有控制謂詞約束其整數參數的用法。例如:

void func()
{
void * p = alloca(n);
f(p);
}
1
2
3
4
5
如果-Walloca-larger-than=500通過,上述情況會觸發警告,但這次是因為缺少邊界檢查。

請注意,即使看起來正確的代碼涉及有符號整數可能會導致警告:

void func (signed int n)
{
if (n < 500)
{
p = alloca (n);
f (p);
}
}
1
2
3
4
5
6
7
8
在上面的例子中,n可能是負數,導致比期望的參數更隱含地投入到alloca調用中。

此選項還會alloca在循環中使用時發出警告。

此警告未啟用 -Wall ,並且只在有效時才有效 -ftree-VRP 是活動的(默認為 -02 以上)。

也可以看看 -Wvla-greater-than = n 。

-Warray-bounds
-Warray-bounds= n
該選項僅在激活時才有效 -ftree-VRP 是活動的(默認為 -02以上)。它警告下標總是超出范圍的數組。此警告由啟用-Wall 。

-Warray-bounds=1
這是警告級別 -Warray界 並被啟用 -Wall; 更高層次不是,並且必須明確要求。

-Warray-bounds=2
此警告級別還會警告結構體末端的數組以及通過指針訪問的數組的出界限。此警告級別可能會導致大量的誤報,並且默認情況下會停用。

-Wattribute-alias
警告使用alias目標與別名類型不兼容的類似屬性的聲明。請參閱聲明函數的屬性。

-Wbool-compare
與不同於true/ 的整數值相比,關於布爾表達式的警告false。例如,以下比較始終是錯誤的:

int n = 5;

if ((n > 1) == 2) { … }
1
2
3
此警告由啟用 -Wall 。

-Wbool-operation
警告布爾類型表達式的可疑操作。例如,按位取反布爾值很可能是程序中的一個錯誤。對於C來說,這個警告還會警告增加或減少布爾值,這很少有意義。(在C ++中,遞減布爾值總是無效的。在C ++ 17中遞增布爾值是無效的,否則不推薦使用。)

此警告由啟用 -Wall 。

-Wduplicated-branches
當if-else具有相同的分支時發出警告。此警告檢測類似的情況

if (p != NULL)
return 0;
else
return 0;
1
2
3
4
當兩個分支只包含一個空語句時它不會發出警告。此警告還警告有條件的操作員:

int i = x?* p:* p;
-Wduplicated-cond
在if-else-if鏈中警告重復的條件。例如,警告以下代碼:

if (p->q != NULL) { … }
else if (p->q != NULL) { … }
1
2
-Wframe-address
警告當’ __builtin_frame_address ’ 要么 ’ __builtin_return_address’被調用的參數大於0.這種調用可能會返回不確定的值或崩潰程序。警告包含在-Wall 。

-Wno-discarded-qualifiers (C and Objective-C only)
不要警告指針上的類型限定符是否被丟棄。通常,編譯器會警告const char *變量是否傳遞給了一個帶char *參數的函數。這個選項可以用來抑制這樣的警告。

-Wno-discarded-array-qualifiers (C and Objective-C only)
不要警告在指針目標數組上的類型限定符是否被丟棄。通常,編譯器會警告const int ()[]變量是否傳遞給了一個帶int ()[]參數的函數。這個選項可以用來抑制這樣的警告。

-Wno-incompatible-pointer-types (C and Objective-C only)
當不兼容類型的指針之間發生轉換時,不要發出警告。此警告適用於未涵蓋的情況-Wno指針-SIGN ,它警告指針參數傳遞或具有不同簽名的分配。

-Wno-int-conversion (C and Objective-C only)
不要警告不兼容的整數指針和指向整數轉換的指針。此警告是關於隱式轉換的; 用於顯式轉換警告-Wno-INT到指針鑄造 和 -Wno指針到INT-投 可能用過了。

-Wno-div-by-zero
不要警告編譯時的整數除零。零點浮點除法沒有被警告,因為它可以是獲得無窮大和NaN的合法方式。

-Wsystem-headers
打印系統頭文件中的結構的警告消息。系統頭文件中的警告通常會被抑制,假設它們通常不表示真正的問題,並且只會使編譯器輸出更難以閱讀。使用這個命令行選項可以告訴GCC從系統標題中發出警告,就好像它們出現在用戶代碼中一樣。但是,請注意使用-Wall與此選項一起並沒有警告的系統頭,對於未知編譯指示,-Wunknown的編譯指示 也必須使用。

-Wtautological-compare
警告如果自我比較總是評估為真或假。此警告檢測各種錯誤,如:

int i = 1;

if (i > i) { … }
1
2
3
此警告還會警告總是評估為真或假的比特比較,例如:

if ((a & 16) == 10) { … }
1
將永遠是錯誤的。

此警告由啟用 -Wall 。

-Wtrampolines
警告為指向嵌套函數生成的蹦床。蹦床是在運行時在堆棧上創建的一小段數據或代碼,當嵌套函數的地址被采用時,用於間接調用嵌套函數。對於某些目標,它僅由數據組成,因此不需要特殊處理。但是,對於大多數目標來說,它是由代碼組成的,因此需要使堆棧可執行才能使程序正常工作。

-Wfloat-equal
如果在相等比較中使用浮點值,則發出警告。

這背后的想法是,有時候對於程序員來說,將浮點值視為對無限精確實數的逼近是很方便的。如果你這樣做,那么你需要計算(通過分析代碼,或者以其他方式)計算引入的最大或可能的最大誤差,並且在執行比較時允許它(並且當產生輸出時,但是這是一個不同的問題)。特別是,您應該檢查兩個值是否具有重疊范圍,而不是測試相等性。這是通過關系運算符完成的,所以平等比較可能是錯誤的。

-Wtraditional (C and Objective-C only)
警告某些在傳統和ISO C中表現不同的結構。還警告有關沒有傳統C等價物的ISO C結構和/或應避免的有問題的結構。

在宏體中出現在字符串文字中的宏參數。在傳統的C宏替換發生在字符串文字中,但在ISO C中不。
在傳統的C中,一些預處理器指令不存在。傳統的預處理器只有在’#‘出現在第1行上。因此-Wtraditional 警告傳統C理解但忽略的指令,因為’ #‘不會顯示為該行的第一個字符。它也建議你#pragma通過縮進來隱藏傳統C無法理解的指令。一些傳統的實現不承認#elif,所以這個選項建議完全避免它。
類似於函數的宏,不帶參數出現。
一元加運算符。
‘’ ü ‘整數常量后綴,或’ F ’ 要么 ’ 大號’浮點常量后綴。(傳統的C確實支持’大號 ‘后綴在整型常量上。)注意,這些后綴出現在大多數現代系統的系統頭文件中定義的宏中,例如’ _Min ‘/’ _MAX’宏’ <limits.h>。在用戶代碼中使用這些宏通常可能會導致虛假警告,但是GCC的集成預處理器有足夠的上下文來避免在這些情況下發出警告。
一個塊在外部聲明的函數,然后在塊結束后使用。
一個switch語句有一個類型的操作數long。
一個非static函數聲明static。這個構造不被一些傳統的C編譯器接受。
整型常量的ISO類型與傳統類型具有不同的寬度或符號。如果該常數的基數為十,則僅發出該警告。即,通常表示位模式的十六進制或八進制值沒有被警告。
檢測到ISO字符串串聯的用法。
自動聚合的初始化。
標識符與標簽沖突。傳統C缺乏標簽的單獨名稱空間。
初始化工會。如果初始值設定為0,則省略警告。這是在假設用戶代碼中的零初始化符出現在例如__STDC__以避免丟失初始化器警告並且在傳統C情況下依靠默認初始化為零的假設下完成的。
原型在固定/浮點值之間進行轉換,反之亦然。與傳統C編譯時缺少這些原型會導致嚴重問題。這是可能的轉換警告的一個子集; 為全套使用-Wtraditional轉換 。
使用ISO C風格函數定義。這個警告是有意不發出原型聲明或可變參數的功能,因為這些ISO C功能使用libiberty傳統C兼容性宏時出現在你的代碼,PARAMS和VPARAMS。對於嵌套函數,此警告也被繞過,因為該功能已經是GCC擴展,因此與傳統的C兼容性無關。
-Wtraditional-conversion (C and Objective-C only)
如果原型導致類型轉換與在沒有原型的情況下發生相同的參數不同,則發出警告。這包括固定點到浮動的轉換,反之亦然,轉換會改變定點參數的寬度或符號,除非與默認提升相同。

-Wdeclaration-after-statement (C and Objective-C only)
在塊中的語句之后發現聲明時發出警告。這個從C ++中知道的構造是用ISO C99引入的,默認情況下允許在GCC中使用。它不受ISO C90的支持。見混合聲明。

-Wshadow
每當局部變量或類型聲明影響另一個變量,參數,類型,類成員(以C ++)或實例變量(在Objective-C中)或每當內置函數被映射時都會報警。請注意,在C ++中,編譯器會警告局部變量是否會影響顯式的typedef,但是如果影響struct / class / enum則不會。與…一樣-Wshadow =全球 。

-Wno-shadow-ivar (Objective-C only)
只要本地變量在Objective-C方法中隱藏實例變量,就不要警告。

-Wshadow=global
默認為 -Wshadow。警告任何(全局)陰影。

-Wshadow=local
警告局部變量會影響另一個局部變量或參數。此警告由啟用-Wshadow =全球 。

-Wshadow=compatible-local
當局部變量隱藏另一個局部變量或類型與陰影變量兼容的參數時發出警告。在C ++中,在這里鍵入兼容性意味着可以將陰影變量的類型轉換為陰影變量的類型。這個標志的創建(除了-Wshadow =本地 )基於這樣的想法:當局部變量隱藏另一個不兼容類型時,它最有可能是故意的,而不是錯誤或拼寫錯誤,如以下示例所示:

for(SomeIterator i = SomeObj.begin(); i!= SomeObj.end(); ++ i)
{
for(int i = 0; i <N; ++ i)
{
...
}
...
}
1
2
3
4
5
6
7
8
由於上述i示例中的兩個變量具有不兼容的類型,因此僅啟用-Wshadow =兼容本地不會發出警告。因為它們的類型是不兼容的,所以如果程序員意外地使用一個來代替另一個,那么類型檢查會捕獲它並發出錯誤或警告。所以在這種情況下不要警告(關於影子)不會導致未被發現的錯誤。使用這個標志而不是-Wshadow =本地 可能會減少故意投影引發的警告數量。

此警告由啟用 -Wshadow =本地 。

-Wlarger-than= len
每當定義大於len字節的對象時發出警告。

-Wframe-larger-than= len
如果函數幀的大小大於len字節,則發出警告。完成確定堆棧幀大小的計算是近似的而不是保守的。即使您沒有收到警告,實際需求可能會比len略高。另外,alloca在確定是否發出警告時,編譯器不包括通過可變長度數組或相關結構分配的任何空間。

-Wno-free-nonheap-object
嘗試釋放未在堆中分配的對象時,不要警告。

-Wstack-usage= len
警告函數的堆棧使用情況可能大於len字節。確定堆棧使用情況的計算是保守的。alloca在確定是否發出警告時,由編譯器包含通過,可變長度數組或相關結構分配的任何空間。

這個消息符合輸出 -fstack使用率 。

如果堆棧使用情況完全是靜態的,但超過了指定的數量,則是:
警告:堆棧使用量為1120字節( warning: stack usage is 1120 bytes)
如果堆棧使用情況(部分)是動態的但有界限的,則是:
警告:堆棧使用可能是1648字節(warning: stack usage might be 1648 bytes)
如果堆棧使用情況(部分)是動態的並且不受限制,那么:
警告:堆棧使用可能是無限的( warning: stack usage might be unbounded)
-Wunsafe-loop-optimizations
警告如果循環無法優化,因為編譯器無法假設循環索引的范圍內的任何內容。同-funsafe循環的優化 警告如果編譯器做出這樣的假設。

-Wno-pedantic-ms-format (MinGW targets only)
與…結合使用時 -Wformat 和 -pedantic無GNU擴展,此選項禁用約非ISO的警告printf/ scanf格式寬度說明I32,I64以及I在Windows目標,其中依賴於MS運行時使用。

-Waligned-new
警告需要更大對齊類型的新表達式,alignof(std::max_align_t)但使用不帶明確對齊參數的分配函數。該選項由啟用-Wall 。

通常這只會警告全局分配函數,但是 -Waligned全新=所有 也警告類成員分配功能。

-Wplacement-new
-Wplacement-new= n
警告使用未定義行為放置新表達式,例如在小於對象類型的緩沖區中構造對象。例如,下面的放置新表達式被診斷,因為它試圖在只有64個字節大的緩沖區中構造64個整數的數組。

char buf [64];
new(buf)int [64];
1
2
該警告默認啟用。

-Wplacement-new=1
這是默認的警告級別 -Wplacement新。在這個級別上,對於一些嚴格未定義的結構,GCC允許將其作為與舊代碼兼容的擴展來發布警告。例如,new即使根據C ++標准具有未定義的行為,也會在該級別診斷下列表達式,因為它會寫入超過一個元素數組的末尾。

struct S {int n,a [1]; };
S * s =(S *)malloc(sizeof * s + 31 * sizeof s-> a [0]);
new(s-> a)int [32]();
1
2
3
-Wplacement-new=2
在這個級別上,除了診斷與級別1相同的所有構造外,還會發布一個診斷信息,用於放置新構造一個對象的最終構造,該構造的最后一個構件的類型是單個元素的數組,並且其大小較小比正在構建的對象的大小。雖然前面的示例將被診斷,但以下構造使用靈活的成員數組擴展來避免第2級的警告。

struct S {int n,a []; };
S * s =(S *)malloc(sizeof * s + 32 * sizeof s-> a [0]);
new(s-> a)int [32]();
1
2
3
-Wpointer-arith
警告任何取決於“功能類型”或“功能類型”的大小void。GNU C將這些類型的大小指定為1,以方便計算void *指針和指向函數的指針。在C ++中,當算術運算涉及時也會發出警告NULL。此警告也由啟用-Wpedantic 。

-Wpointer-compare
如果指針與零字符常量進行比較,則發出警告。這通常意味着指針被解除引用。例如:

const char *p = foo ();
if (p == '\0')
return 42;
1
2
3
請注意,上面的代碼在C ++ 11中無效。

該警告默認啟用。

-Wtype-limits
如果由於數據類型范圍有限而導致比較始終為真或始終為false,但不警告常量表達式。例如,警告如果將一個無符號變量與<或與0進行比較>=。此警告也由啟用-Wextra 。

-Wcomment
-Wcomments
每當評論開始序列’ / * ‘出現在’ / * ‘評論,或者每當一個反斜線換行符出現在’ //'評論。此警告由啟用-Wall 。

-Wtrigraphs
如果遇到可能會改變程序含義的三字母警告,則發出警告。評論中的三字代碼不會被警告,除了那些會形成轉義換行符的代碼。

這個選項是隱含的 -Wall。如果-Wall沒有給出,除非啟用三字母,否則該選項仍然有效。要獲得沒有警告的三字母轉換,但要獲得另一個-Wall 警告,使用’ -trigraphs -Wall -Wno-trigraphs ”。

-Wundef
警告如果在#if指令中評估未定義的標識符。這些標識符被替換為零。

-Wexpansion-to-defined
每當’ 定義 ‘在擴展宏時遇到(包括宏被擴展為’ #如果’指令)。這種用法是不便攜的。此警告也由啟用-Wpedantic 和 -Wextra 。

-Wunused-macros
警告主文件中定義的未使用的宏。如果擴展或測試存在至少一次,則使用宏。預處理器還會警告,如果宏在重新定義或未定義時尚未使用。

內建的宏,命令行中定義的宏和包含文件中定義的宏不會被警告。

注意:如果實際使用宏,但僅用於跳過的條件塊,則預處理器將其報告為未使用。為了避免在這種情況下發出警告,可以通過例如將其移動到第一個跳過的塊中來改善宏定義的范圍。或者,您可以提供一個類似以下內容的虛擬用途:

#if defined the_macro_causing_the_warning
#endif
1
2
-Wno-endif-labels
不論何時#else或#endif之后都有文字,不要警告。這有時會發生在具有表單代碼的較早程序中

#if FOO
...
#else FOO
...
#endif FOO
1
2
3
4
5
第二和第三位FOO應該在評論中。此警告默認開啟。

-Wbad-function-cast (C and Objective-C only)
當函數調用轉換為不匹配類型時發出警告。例如,警告如果對返回整數類型的函數的調用轉換為指針類型。

-Wc90-c99-compat (C and Objective-C only)
警告ISO C90中不存在的功能,但存在於ISO C99中。例如,警告使用可變長度數組,long long類型,bool類型,復合文字,指定初始值設定項等等。該選項獨立於標准模式。在下面的表達式中警告被禁用__extension__。

-Wc99-c11-compat (C and Objective-C only)
警告ISO C99中不存在的功能,但存在於ISO C11中。例如,警告使用匿名結構和聯合,_Atomic類型限定符,_Thread_local存儲類說明符,_Alignas說明符,Alignof運算符,_Generic關鍵字等。該選項獨立於標准模式。在下面的表達式中警告被禁用__extension__。

-Wc+±compat (C and Objective-C only)
警告關於ISO C和ISO C ++的公共子集之外的ISO C構造,例如請求將隱式轉換void *為非void類型指針。

-Wc++11-compat (C++ and Objective-C++ only)
警告ISO C ++ 1998和ISO C ++ 2011之間含義不同的C ++結構,例如ISO C ++ 1998中作為ISO C ++ 2011關鍵字的標識符。此警告將打開 -Wnarrowing 並被啟用 -Wall 。

-Wc++14-compat (C++ and Objective-C++ only)
警告ISO C ++ 2011與ISO C ++ 2014之間含義不同的C ++結構。此警告由。啟用 -Wall 。

-Wc++17-compat (C++ and Objective-C++ only)
警告ISO C ++ 2014和ISO C ++ 2017之間含義不同的C ++結構。此警告由。啟用 -Wall 。

-Wcast-qual
每當指針被強制轉換時都會發出警告,以便從目標類型中刪除類型限定符。例如,警告如果a const char *被投給普通人char *。

在進行以非安全方式引入類型限定符的演員時也會發出警告。例如,鑄造char **到const char **是不安全的,因為在這個例子:

/* p is char ** value. */
const char **q = (const char **) p;
/* Assignment of readonly string to const char * is OK. */
*q = "string";
/* Now char** pointer points to read-only memory. */
**p = 'b';
1
2
3
4
5
6
-Wcast-align
每當指針被施放時發出警告,以便增加目標所需的對齊。 例如,警告如果將char *為整數只能在兩個或四個字節邊界處訪問的機器上的int * 。

-Wcast-align=strict
每當指針被施放時發出警告,以便增加目標所需的對齊。例如,警告如果a char *投射到某個int *目標機器。

-Wcast-function-type
當函數指針轉換為不兼容的函數指針時發出警告。在涉及具有可變參數列表的函數類型的轉換中,僅考慮所提供的初始參數的類型。指針類型的任何參數都與任何其他指針類型匹配。在整型任何良性的差異被忽略,就像int主場迎戰long上ILP32目標。同樣,類型限定符也被忽略。函數類型void (*) (void)是特殊的,並匹配所有內容,可用於抑制此警告。在涉及指向成員類型的指針的轉換中,只要類型轉換將指針更改為成員類型,此警告就會發出警告。此警告由啟用-Wextra 。

-Wwrite-strings
編譯C時,給字符串常量類型,以便將一個地址復制到非指針中會產生警告。這些警告幫助您在編譯時查找可以嘗試寫入字符串常量的代碼,但前提是您在聲明和原型中使用時一直非常小心。否則,這只是一個滋擾。這就是我們沒有制造的原因const char[ length ]const char *const-Wall 請求這些警告。

編譯C ++時,警告關於從字符串文字到不再使用的轉換char *。C ++程序默認啟用此警告。

-Wcatch-value
-Wcatch-value= n (C++ and Objective-C++ only)
警告關於捕捉處理程序,不通過參考捕獲。同-Wcatch值= 1 (要么 -Wcatch價值簡稱)警告關於被值捕獲的多態類類型。同-Wcatch值= 2警告所有類型的價值。同-Wcatch值= 3 警告所有沒有被引用捕獲的類型。 -Wcatch價值 由…啟用 -Wall 。

-Wclobbered
警告可能由longjmp或更改的變量vfork。此警告也由啟用-Wextra 。

-Wconditionally-supported (C++ and Objective-C++ only)
警告有條件支持的(C ++ 11 [intro.defs])結構。

-Wconversion
警告可能會改變值的隱式轉換。這包括實數和整數,等之間轉換abs (x)時x是double; 有符號和無符號之間的轉換,如unsigned ui = -1; 並轉換為較小的類型,例如sqrtf (M_PI)。不要警告像abs ((int) x)和的明確轉換ui = (unsigned) -1,或者如果值沒有像轉換那樣改變abs (2.0)。有關已簽名和未簽名整數之間轉換的警告可以通過使用禁用-Wno-符號轉換 。

對於C ++,也會警告混淆用戶定義轉換的重載解析; 以及從不使用類型轉換運算符的轉換:轉換為void,相同類型,基類或對它們的引用。在C ++中,有關已簽名和未簽名整數之間轉換的警告在默認情況下是禁用的,除非-Wsign轉換 被明確啟用。

-Wno-conversion-null (C++ and Objective-C++ only)
不要警告NULL非指針類型之間的轉換。-Wconversion空 是默認啟用的。

-Wzero-as-null-pointer-constant (C++ and Objective-C++ only)
警告當字面’ 0’用作空指針常量。這對於促進nullptr在C ++ 11中的轉換很有用。

-Wsubobject-linkage (C++ and Objective-C++ only)
如果類類型具有基類或字段類型使用匿名命名空間或依賴於沒有鏈接的類型,則發出警告。如果類型A依賴於沒有或內部鏈接的類型B,則將其定義為多個翻譯單元將會違反ODR,因為每個翻譯單元中B的含義不同。如果A只出現在單個翻譯單元中,則最好的方法是將其置於匿名命名空間中以使其與內部關聯。編譯器不會針對主要.C文件中定義的類型給出此警告,因為這些警告不可能有多個定義。-Wsubobject聯動 是默認啟用的。

-Wdangling-else
警告可能會混淆分支所屬的if聲明的構造else。以下是這種情況的一個例子:

{
if (a)
if (b)
foo ();
else
bar ();
}
1
2
3
4
5
6
7
在C / C ++中,每個else分支都屬於最內層的可能if語句,在本例中為if (b)。這通常不是程序員所期望的,正如上例中程序員選擇的縮進所示。當可能出現這種混淆時,GCC會在指定此標志時發出警告。為了消除這個警告,在最里面的if語句周圍添加顯式大括號,這樣就else不可能屬於這個封閉if。生成的代碼如下所示:

{
if (a)
{
if (b)
foo ();
else
bar ();
}
}
1
2
3
4
5
6
7
8
9
此警告由啟用 -Wparentheses 。

-Wdate-time
當遇到宏或遇到警告時__TIME__,可能會阻止按位重復編譯。__DATE____TIMESTAMP__

-Wdelete-incomplete (C++ and Objective-C++ only)
Warn when deleting a pointer to incomplete type, which may cause undefined behavior at runtime. This warning is enabled by default.

-Wuseless-cast (C++ and Objective-C++ only)
Warn when an expression is casted to its own type.

-Wempty-body
Warn if an empty body occurs in an if , else or do while statement. This warning is also enabled by -Wextra .

-Wenum-compare
Warn about a comparison between values of different enumerated types. In C++ enumerated type mismatches in conditional expressions are also diagnosed and the warning is enabled by default. In C this warning is enabled by -Wall .

-Wextra-semi (C++, Objective-C++ only)
Warn about redundant semicolon after in-class function definition.

-Wjump-misses-init (C, Objective-C only)
如果goto語句或switch語句在變量的初始化過程中向前跳轉,或者在變量初始化后向后跳轉到標簽,則發出警告。這只會對在聲明時初始化的變量發出警告。此警告僅支持C和Objective-C; 在C ++中,這種分支在任何情況下都是錯誤的。

-Wjump門柱-INIT 包含在內 -Wc ++ - COMPAT。它可以被禁用-Wno跳門柱-INIT 選項。

-Wsign-compare
當有符號值和無符號值之間的比較可能會在有符號值轉換為無符號時產生錯誤結果時發出警告。在C ++中,這個警告也是由-Wall。在C中,它也被啟用-Wextra 。

-Wsign-conversion
警告可能會改變整數值符號的隱式轉換,如將有符號整數表達式分配給無符號整數變量。明確的演員沉默警告。在C中,這個選項也可以通過-Wconversion 。

-Wfloat-conversion
警告隱式轉換會降低實際值的精度。這包括從實數到整數的轉換,以及從更高精度實數到更低精度實數值的轉換。該選項也可以通過-Wconversion 。

-Wno-scalar-storage-order
不要警告涉及反向標量存儲順序的可疑構造。

-Wsized-deallocation (C++ and Objective-C++ only)
警告未定義的釋放函數的定義

void operator delete(void *)noexcept;
void operator delete [](void *)noexcept;
1
2
而沒有定義相應大小的釋放函數

void operator delete(void *,std :: size_t)noexcept;
void operator delete [](void *,std :: size_t)noexcept;
1
2
或相反亦然。啟用-Wextra 隨着 -fsized,釋放 。

-Wsizeof-pointer-div
警告兩個sizeof表達式的可疑分割,這兩個sizeof表達式將指針大小除以元素大小,這是計算數組大小的常用方法,但不能正確使用指針。此警告警告,例如關於sizeof (ptr) / sizeof (ptr[0])如果ptr不是數組,而是指針。此警告由啟用-Wall 。

-Wsizeof-pointer-memaccess
如果參數使用,則向某些字符串和內存內置函數警告可疑長度參數sizeof。例如,這個警告觸發了memset (ptr, 0, sizeof (ptr));if ptr不是一個數組,而是一個指針,並且提出了一個可能的修正或關於memcpy (&foo, ptr, sizeof (&foo)); 。 -Wsizeof指針-memaccess還會警告有關字符串復制函數的調用,strncat或者strncpy指定為sizeof源數組的表達式。例如,在以下函數中,調用strncat將源字符串的大小指定為邊界。這幾乎肯定是一個錯誤,因此呼叫被診斷。

void make_file(const char * name)
{
char path [PATH_MAX];
strncpy(path,name,sizeof path - 1);
strncat(path,“.text”,sizeof“.text”);
...
}
1
2
3
4
5
6
7
該 -Wsizeof指針-memaccess 選項由啟用 -Wall 。

-Wsizeof-array-argument
當sizeof運算符應用於在函數定義中聲明為數組的參數時發出警告。C和C ++程序默認啟用此警告。

-Wmemset-elt-size
memset如果第一個參數引用一個數組,並且第三個參數是一個等於元素數的數字,但不等於內存中數組的大小,則警告對內置函數的可疑調用。這表明用戶已經省略了元素大小的乘法。此警告由啟用-Wall 。

-Wmemset-transposed-args
memset如果第二個參數不為零且第三個參數為零,則警告對內置函數的可疑調用。這警告了例如memset (buf, sizeof buf, 0)最可能的memset (buf, 0, sizeof buf)意思。只有第三個參數為零時才會發出診斷信息。如果它的某個表達式被折疊為零,對於某種類型的零等等,則用戶錯誤地交換參數並且不發出警告的可能性就小得多。此警告由啟用-Wall 。

-Waddress
警告內存地址的可疑使用。這些包括在一個條件表達式中使用一個函數的地址,比如void func(void); if (func),和一個字符串文字的內存地址比較,比如if (x == “abc”)。這種用法通常表示程序員錯誤:函數的地址總是計算為真,因此它們在條件中的使用通常表示程序員在函數調用中忘記了括號; 並且與字符串文字的比較導致未指定的行為並且在C中不可移植,所以它們通常表示程序員打算使用strcmp。此警告由啟用-Wall 。

-Wlogical-op
在表達式中警告邏輯運算符的可疑用法。這包括在可能期望按位運算符的上下文中使用邏輯運算符。此外還警告邏輯運算符的操作數是否相同:

extern int a;
if (a < 0 && a < 0) { … }
1
2
-Wlogical-not-parentheses
警告關於邏輯不用在比較的左側操作數上。如果右操作數被認為是布爾表達式,該選項不會警告。其目的是檢測如下的可疑代碼:

int a;

if (!a > 1) { … }
1
2
3
可以通過將LHS包括在括號中來抑制警告:

if ((!a) > 1) { … }
1
此警告由啟用 -Wall 。

-Waggregate-return
警告是否定義或調用了返回結構或聯合的任何函數。(在可以返回數組的語言中,這也會引發警告。)

-Wno-aggressive-loop-optimizations
如果在具有恆定迭代次數的循環中發出警告,編譯器在一次或多次迭代過程中檢測到某些語句中的未定義行為。

-Wno-attributes
不要警告是否使用了意外__attribute__情況,例如無法識別的屬性,應用於變量的功能屬性等。這不會阻止錯誤使用受支持屬性的錯誤。

-Wno-builtin-declaration-mismatch
如果使用錯誤的簽名或非功能聲明了內置函數,則發出警告。該警告默認啟用。

-Wno-builtin-macro-redefined
如果某些內置宏被重新定義,請不要警告。這抑制了警告的重新定義__TIMESTAMP__,__TIME__,__DATE__,__FILE__,和__BASE_FILE__。

-Wstrict-prototypes (C and Objective-C only)
警告如果一個函數被聲明或定義而沒有指定參數類型。(如果前面有指定參數類型的聲明,則允許舊式函數定義不帶警告。)

-Wold-style-declaration (C and Objective-C only)
根據C標准,在聲明中警告過時的用法。例如,警告存儲類說明符static不是聲明中的第一件事情。此警告也由啟用-Wextra 。

-Wold-style-definition (C and Objective-C only)
如果使用舊式函數定義,則發出警告。即使存在以前的原型,也會發出警告。

-Wmissing-parameter-type (C and Objective-C only)
在K&R樣式函數中聲明函數參數時沒有類型說明符:

void foo(bar){}
1
此警告也由啟用 -Wextra 。

-Wmissing-prototypes (C and Objective-C only)
警告如果沒有先前的原型聲明定義全局函數。即使定義本身提供了原型,也會發出此警告。使用此選項可檢測頭文件中沒有匹配原型聲明的全局函數。此選項對C ++無效,因為所有函數聲明都提供了原型,而非匹配聲明聲明了重載而不是與先前的聲明沖突。使用-Wmissing申述 在C ++中檢測缺少的聲明。

-Wmissing-declarations
警告如果沒有先前的聲明定義全局函數。即使定義本身提供了原型,也是如此。使用此選項可檢測未在頭文件中聲明的全局函數。在C中,對於以前的非原型聲明的函數不會發出警告; 使用-Wmissing的原型檢測丟失的原型。在C ++中,不會為函數模板,內聯函數或匿名命名空間中的函數發出警告。

-Wmissing-field-initializers
如果結構的初始化程序缺少某些字段,則發出警告。例如,下面的代碼會導致這樣的警告,因為xh它隱含地為零:

struct s {int f,g,h; };
struct sx = {3,4};
1
2
此選項不會警告指定的初始化程序,因此以下修改不會觸發警告:

struct s {int f,g,h; };
struct sx = {.f = 3,.g = 4};
1
2
在C中,這個選項不會警告通用零初始化器’ {0} “:

struct s {int f,g,h; };
struct sx = {0};
1
2
同樣,在C ++中,此選項不會警告空{}初始化程序,例如:

struct s {int f,g,h; };
sx = {};
1
2
此警告包含在中 -Wextra。獲得其他-Wextra 沒有這個警告,使用 -Wextra -Wno-missing-field-initializers 。

-Wno-multichar
不要警告如果多字符常量(’ ‘FOOF’’) 用來。通常,它們表示用戶代碼中存在拼寫錯誤,因為它們具有實現定義的值,不應將其用於可移植代碼中。

-Wnormalized= [ none | id | nfc | nfkc ]
在ISO C和ISO C ++中,如果兩個標識符是不同的字符序列,則它們是不同的。但是,有時使用基本ASCII字符集之外的字符時,可以有兩個看起來相同的不同字符序列。為避免混淆,ISO 10646標准規定了一些規范化規則,在應用時確保兩個看起來相同的序列變成相同的序列。如果您使用尚未正常化的標識符,GCC可以警告您; 該選項控制該警告。

GCC支持四級警告。默認是-Wnormalized = NFC,它警告任何非ISO 10646“C”規范化形式的標識符NFC。NFC是大多數用途的推薦形式。這相當於-Wnormalized 。

不幸的是,ISO C和ISO C ++在標識符中允許有一些字符在變成NFC時不允許用於標識符。也就是說,無法在便攜式ISO C或C ++中使用這些符號,並且在NFC中使用所有標識符。-Wnormalized = ID抑制這些字符的警告。希望未來版本的標准能夠糾正這個問題,這就是為什么這個選項不是默認選項。

您可以通過書寫來關閉所有角色的警告 -Wnormalized =無 要么 -Wno標准化。如果您使用其他規范化方案(如“D”),則只應執行此操作,否則您可以輕松創建幾乎不可能看到的錯誤。

ISO 10646中的一些字符具有不同的含義,但在某些字體或顯示方法中看起來完全相同,尤其是在應用格式化之后。例如\u207F,“SUPERSCRIPT LATIN SMALL LETTER N”,就像一個n放在上標中的常規一樣顯示。ISO 10646定義了NFKC規范化方案,將所有這些轉換為標准格式,如果您使用的代碼不在NFKC中,GCC會發出警告-Wnormalized = nfkc。此警告與包含字母O的每個標識符的警告相當,因為它可能與數字0混淆,所以不是默認值,但如果編程環境無法修復以顯示這些內容,則可能作為本地編碼約定有用字符清晰。

-Wno-deprecated
不要警告使用已棄用的功能。請參閱棄用功能。

-Wno-deprecated-declarations
不要警告使用屬性標記為棄用的函數(請參閱函數屬性),變量(請參閱變量屬性)和類型(請參閱類型屬性)deprecated。

-Wno-overflow
不要警告常量表達式中的編譯時溢出。

-Wno-odr
在鏈接時間優化期間警告一個定義規則違規。需要-flto-ODR型合並 啟用。 默認啟用。

-Wopenmp-simd
如果向量化器成本模型覆蓋用戶設置的OpenMP simd指令,則發出警告。該-fsimd成本模型=無限 選項可以用來放寬成本模型。

-Woverride-init (C and Objective-C only)
如果在使用指定初始值設定項時覆蓋沒有副作用的初始化域,請警告(請參閱指定初始值設定項)。

此警告包含在中 -Wextra。獲得其他-Wextra 沒有這個警告,使用 -Wextra -Wno-override-init 。

-Woverride-init-side-effects (C and Objective-C only)
警告如果使用指定的初始值設定項時會覆蓋具有副作用的初始化字段(請參閱指定的初始值設定項)。該警告默認啟用。

-Wpacked
如果給定結構的打包屬性,但打包的屬性對結構的布局或大小沒有影響,則警告。這樣的結構可能會失去對齊的好處。例如,在這段代碼中,變量fxin struct bar沒有對齊,盡管struct bar它本身沒有packed屬性:

struct foo {
int x;
char a,b,c,d;
} __attribute __((packed));
結構欄{
char z;
struct foo f;
};
1
2
3
4
5
6
7
8
-Wpacked-bitfield-compat
GCC的4.1,4.2和4.3系列忽略了packed類型位字段上的屬性char。這已經在GCC 4.4中得到了修復,但是這種改變會導致結構布局的差異。當GCC 4.4中這個字段的偏移已經改變時,GCC會通知你。例如,字段a和b結構之間不再有4位填充:

struct foo
{
char a:4;
char b:8;
} __attribute__((packed));
1
2
3
4
5
該警告默認啟用。使用-Wno-填充位字段,COMPAT 禁用此警告。

-Wpacked-not-aligned (C, C++, Objective-C and Objective-C++ only)
如果在打包結構或聯合中顯式指定對齊的結構字段未對齊,則警告警告。例如,在此代碼中將會發出警告struct S,如warning: alignment 1 of ‘struct S’ is less than 8:

struct __attribute__((aligned(8)))S8 {char a [8]; };
struct __attribute__((packed))S {
struct S8 s8;
};
1
2
3
4
此警告由啟用 -Wall 。

-Wpadded
警告如果填充包含在結構中,則要對齊結構的某個元素或對齊整個結構。有時候發生這種情況時,可以重新排列結構的字段以減少填充,從而使結構更小。

-Wredundant-decls
如果在同一范圍內多次聲明任何內容,即使在多重聲明有效且不做任何更改的情況下也會發出警告。

-Wno-restrict
當由一個restrict-qualified參數引用的對象(或者在C ++中,一個__restrict-qualified參數)被另一個參數別名時,或者當這些對象之間的副本重疊時引發警告。例如,對strcpy下面函數的調用嘗試通過用最后四個字符替換其初始字符來截斷字符串。但是,由於呼叫將終止NUL寫入a[4],副本重疊並且呼叫被診斷。

void foo(void)
{
char a [] =“abcd1234”;
strcpy(a,a + 4);
...
}
1
2
3
4
5
6
該 -Wrestrict 選項檢測到一些簡單重疊的情況,即使沒有進行優化,但最適用於 -02以上。它包含在中-Wall 。

-Wnested-externs (C and Objective-C only)
警告如果extern在函數中遇到聲明。

-Wno-inherited-variadic-ctor
當繼承的基類具有C可變參數構造函數時,禁止使用C ++ 11繼承構造函數的警告; 警告默認打開,因為省略號不被繼承。

-Winline
警告如果聲明為內聯的函數不能內聯。即使使用此選項,編譯器也不會警告內聯函數在系統頭文件中聲明的函數失敗。

編譯器使用各種啟發式來確定是否內聯一個函數。例如,編譯器考慮了內聯函數的大小以及當前函數中已經完成的內聯量。因此,源程序中看似微不足道的變化可能會導致警告-Winline 出現或消失。

-Wno-invalid-offsetof (C++ and Objective-C++ only)
禁止將offsetof宏應用於非POD類型的警告。根據2014年ISO C ++標准,應用於offsetof非標准布局類型是未定義的。然而,在現有的C ++實現中,offsetof通常會給出有意義的結果。此標志適用於意識到他們正在編寫非易用代碼並且故意選擇忽略有關警告的用戶。

offsetof在未來的C ++標准版本中,這些限制可能會放寬。

-Wint-in-bool-context
在可能使用布爾值的情況下警告使用整數值,例如條件表達式(?:)在布爾上下文中使用非布爾整型常量,例如if (a <= b ? 2 : 3)。或者在布爾上下文中左移有符號整數,如for (a = 0; 1 << a; a++); 。同樣,對於所有類型的乘法,無論數據類型如何。此警告由啟用-Wall 。

-Wno-int-to-pointer-cast
將強制轉換的警告抑制為不同大小整數的指針類型。在C ++中,轉換為較小大小的指針類型是錯誤的。溫特對指針的投 是默認啟用的。

-Wno-pointer-to-int-cast (C and Objective-C only)
禁止來自指針的強制轉換為不同大小整數類型的警告。

-Winvalid-pch
警告如果在搜索路徑中找到預編譯頭(請參閱預編譯頭),但無法使用。

-Wlong-long
警告如果使用long long類型。這是由任一啟用-Wpedantic 要么 -Wtraditional在ISO C90和C ++ 98模式下。要禁止警告消息,請使用-Wno-長隆 。

-Wvariadic-macros
如果在ISO C90模式下使用可變宏,或者在ISO C99模式下使用GNU替代語法,則發出警告。這是由任一啟用-Wpedantic 要么 -Wtraditional。要禁止警告消息,請使用-Wno-可變參數的宏 。

-Wvarargs
警告用於處理可變參數的宏的可疑用法va_start。這是默認設置。 要禁止警告消息,請使用 -Wno-可變參數 。

-Wvector-operation-performance
如果矢量操作未通過體系結構的SIMD功能實現,則發出警告。主要用於性能調整。可以實現向量操作piecewise,這意味着標量操作在每個向量元素上執行; in parallel,這意味着向量操作是使用更寬類型的標量來實現的,這通常是更高的性能效率; 並且as a single scalar,這意味着矢量裝配到一個標量類型。

-Wno-virtual-move-assign
使用非平凡的C ++ 11移動賦值運算符來抑制有關從虛擬基礎繼承的警告。這是很危險的,因為如果虛擬基地沿着多條路徑可到達,它會多次移動,這可能意味着兩個對象最終都處於移動狀態。如果寫入移動賦值運算符以避免從移出的對象移動,則可以禁用此警告。

-Wvla
如果代碼中使用了可變長度的數組,則會發出警告。 -Wno-VLA 防止 -Wpedantic 警告變長數組。

-Wvla-larger-than= n
如果使用此選項,編譯器將警告使用可變長度數組,其大小要么是無限的,要么是大於n字節的參數。這與如何相似-Walloca-greater-than = n 工作,但與變長數組。

請注意,GCC可能會將已知值的小型可變長度數組優化為普通數組,因此可能無法觸發此警告。

此警告未啟用 -Wall ,並且只在有效時才有效 -ftree-VRP 是活動的(默認為 -02 以上)。

也可以看看 -Walloca-greater-than = n 。

-Wvolatile-register-var
如果寄存器變量被聲明為volatile,則發出警告。volatile修飾符不會禁止可能會消除讀取和/或寫入寄存器變量的所有優化。此警告由啟用-Wall 。

-Wdisabled-optimization
如果請求的優化傳遞被禁用,則發出警告。此警告通常並不表示您的代碼有任何問題; 它只是表明GCC的優化器無法有效處理代碼。通常,問題在於你的代碼太大或太復雜; 當優化本身可能花費過多時間時,GCC拒絕優化程序。

-Wpointer-sign (C and Objective-C only)
警告指針參數傳遞或具有不同簽名的分配。該選項僅支持C和Objective-C。它暗示着-Wall 並通過 -Wpedantic ,可以禁用 -Wno指針-SIGN 。

-Wstack-protector
該選項僅在激活時才有效 -fstack保護器活躍。它警告那些不能防止堆棧粉碎的功能。

-Woverlength-strings
警告字符串常量的長度超過C標准中指定的“最小最大長度”。現代編譯器通常允許比標准的最小限制長得多的字符串常量,但是非常便攜的程序應該避免使用更長的字符串。

該限制適用於字符串常量級聯之后,並且不計算尾隨NUL。在C90中,限制為509個字符; 在C99中,它被提升到了4095. C ++ 98沒有規定最小最大規范,所以我們不用診斷C ++中的超長字符串。

這個選項是隱含的 -Wpedantic ,並可以禁用 -Wno-超長串 。

-Wunsuffixed-float-constants (C and Objective-C only)
對任何沒有后綴的浮動常量發出警告。與…一起使用時-Wsystem報頭它會在系統頭文件中警告這些常量。在准備代碼以使用FLOAT_CONST_DECIMAL64從C99到十進制浮點擴展的編譯指示時,這非常有用。

-Wno-designated-init (C and Objective-C only)
使用位置初始化程序初始化已標記了designated_init屬性的結構時,禁止警告。

-Whsa
當編譯的函數或OpenMP構造不能釋放HSAIL時發出警告。
————————————————
版權聲明:本文為CSDN博主「青丶空゛」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_17308321/article/details/79979514


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM