223

文字通り、GCC が持つすべての警告を有効にしたいと思います。(簡単だと思いますが…)

  • -Wallあなたはトリックを行うかもしれないと思うかもしれませんが、違います! まだ必要-Wextraです。

  • -Wextraあなたはトリックを行うかもしれないと思うかもしれませんが、違います! ここにリストされているすべての警告(たとえば、-Wshadow) がこれによって有効になるわけではありません。そして、このリストが包括的なものかどうかはまだわかりません.

GCC にすべての警告を有効にする (if、and、または but はありません!) ように指示するにはどうすればよいですか?

4

7 に答える 7

85

文字通りすべての警告を有効にすることはおそらく有益ではないという以前の回答に同意しますが、GCC はこれを達成するための合理的に便利な方法を提供します。コマンド

gcc -Q --help=warning

サポートされているすべての警告オプションのリストと、それらがアクティブかどうかに関する情報を提供します。ちなみに、これを使用して、eg-Wallおよび-Wextra

gcc -Wall -Wextra -Q --help=warning

すべての警告を有効にするには、正規表現を使用してコマンド ライン パラメータを抽出します。

gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n'

私の現在のGCCでは、これは次のようになります:

-Wabi -Wabi-tag -Waddress -Waggregate-return -Waggressive-loop-optimizations -Waliasing -Walign-commons -Wampersand -Warray-bounds -Warray-temporaries -Wassign-intercept -Wattributes -Wbad-function-cast -Wbool-compare -Wbuiltin-macro-redefined -Wc++-compat -Wc++0x-compat -Wc++14-compat -Wc-binding-type -Wc90-c99-compat -Wc99-c11-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wcharacter-truncation -Wchkp -Wclobbered -Wcomment -Wcompare-reals -Wconditionally-supported -Wconversion -Wconversion-extra -Wconversion-null -Wcoverage-mismatch -Wcpp -Wctor-dtor-privacy -Wdate-time -Wdeclaration -after-statement -Wdelete-incomplete -Wdelete-non-virtual-dtor -Wdeprecated -Wdeprecated-declarations -Wdesignated-init -Wdisabled-optimization -Wdiscarded-array-qualifiers -Wdiscarded-qualifiers -Wdiv-by-zero -Wdouble-promotion -Weffc++ -ウェンプティボディ-Wendif-labels -Wenum-compare -Wextra -Wfloat-equal -Wformat-contains-nul -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-signedness -Wformat-y2k -Wformat-zero-length -Wfree -nonheap-object -Wfunction-elimination -Wignored-qualifiers -Wimplicit -Wimplicit-function-declaration -Wimplicit-int -Wimplicit-interface -Wimplicit-procedure -Wincompatible-pointer-types -Winherited-variadic-ctor -Winit-self -Winline -Wint-conversion -Wint-to-pointer-cast -Wintrinsic-shadow -Wintrinsics-std -Winvalid-memory-model -Winvalid-offsetof -Winvalid-pch -Wjump-misses-init -Wline-truncation -Wliteral-suffix -Wlogical -not-parentheses -Wlogical-op -Wlong-long -Wmain -Wmaybe-uninitialized -Wmemset-transposed-args -Wmissing-braces -Wmissing-declarations -Wmissing-field-initializers -Wmissing-include-dirs -Wmissing-parameter-type -Wmissing-prototypes-Wmultichar -Wnarrowing -Wnested-externs -Wnoexcept -Wnon-template-friend -Wnon-virtual-dtor -Wnonnull -Wodr -Wold-style-cast -Wold-style-declaration -Wold-style-definition -Wopenmp-simd -Woverflow -Woverlength-strings -Woverloaded-virtual -Woverride-init -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpedantic -Wpmf-conversions -Wpointer-arith -Wpointer-sign -Wpointer-to-int-cast -Wpragmas -Wproperty -assign-default -Wprotocol -Wreal-q-constant -Wrealloc-lhs -Wrealloc-lhs-all -Wredundant-decls -Wreorder -Wreturn-local-addr -Wreturn-type -Wselector -Wsequence-point -Wshadow -Wshadow-ivar -Wshift-count-negative -Wshift-count-overflow -Wsign-compare -Wsign-promo -Wsized-deallocation -Wsizeof-array-argument -Wsizeof-pointer-memaccess -Wstack-protector -Wstrict-null-sentinel -Wstrict-prototypes -Wstrict-selector-match-Wsuggest-attribute=const -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wsuggest-attribute=pure -Wsuggest-final-methods -Wsuggest-final-types -Wsuggest-override -Wsurprising -Wswitch -Wswitch-bool -Wswitch -default -Wswitch-enum -Wsync-nand -Wsynth -Wsystem-headers -Wtabs -Wtarget-lifetime -Wtraditional -Wtraditional-conversion -Wtrampolines -Wtrigraphs -Wtype-limits -Wundeclared-selector -Wundef -Wunderflow -Wuninitialized -Wunknown-pragmas -Wunsafe-loop-optimizations -Wunsuffixed-float-constants -Wunused -Wunused-but-set-parameter -Wunused-but-set-variable -Wunused-dummy-argument -Wunused-function -Wunused-label -Wunused-local-typedefs -Wunused-macros -Wunused-parameter -Wunused-result -Wunused-value -Wunused-variable -Wuse-without-only -Wuseless-cast -Wvarargs -Wvariadic-macros -Wvector-operation-performance -Wvirtual-move-assign-Wvla -Wvolatile-register-var -Wwrite-strings -Wzero-as-null-pointer-constant -Wzerotrip -frequire-return-statement

これを使用して GCC を呼び出すことができます。

gcc $(gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n')

ただし、一部の警告オプションは特定の言語でしか使用できないため、警告が発生することに注意してください (例: C++)。これらは、正規表現を使用して現在の言語で許可されているオプションのみを含めるか-Wno-whatever、呼び出しの最後に適切なを追加することで回避できます。

于 2016-01-24T02:00:49.720 に答える
16

すべての警告を有効にしてプログラムすることはまったく不可能です (無視するつもりがない限り、しかし、なぜ気にする必要があるのでしょうか?)。たとえば、次の一連のフラグを使用するとします-Wstrict-prototypes -Wtraditional

2 つの警告を有効にしても、次のプログラムは文句を言います。

/tmp $ cat main.c 
int main(int argc, char **argv) {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c: In function ‘main’:
main.c:1:5: warning: traditional C rejects ISO C style function definitions [-Wtraditional]
 int main(int argc, char **argv) {
     ^

「まあ、古いスタイルのプロトタイプを使用するつもりだ」と思うかもしれません。いいえ、これはうまくいきません。

/tmp $ cat main.c 
int main(argc, argv)
    int argc;
    char **argv;
{
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isn’t a prototype [-Wstrict-prototypes]
 int main(argc, argv)
     ^

いいえ、コンパイラも文句を言うので、プロトタイプを指定しないことも間違っています。

/tmp $ cat main.c 
int main() {
    return 0;
}
/tmp $ gcc -Wstrict-prototypes -Wtraditional main.c 
main.c:1:5: warning: function declaration isn’t a prototype [-Wstrict-prototypes]
 int main() {
     ^

プログラム内で関数を定義する場合、すべてのフラグを使用することはできません。これは、コンパイラが考えられる関数定義について文句を言うからです。

C++ の場合、これは可能であり (-Wtraditionalフラグは存在しません)、非常に単純なプログラムをコンパイルできます。すべての警告を有効にするには、次の警告リストを使用します (おそらく、いくつかの警告が重複しています-Wall

-Wabi -Wctor-dtor-privacy -Wnon-virtual-dtor -Wreorder -Weffc++ -Wstrict-null-sentinel -Wno-non-template-friend -Wold-style-cast -Woverloaded-virtual -Wno-pmf-conversions -Wsign-promo -Wextra -Wall -Waddress -Waggregate-return -Warray-bounds -Wno-attributes -Wno-builtin-macro-redefined -Wc++0x-compat -Wcast-align -Wcast-qual -Wchar-subscripts -Wclobbered -Wcomment -Wconversion -Wcoverage-mismatch -Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization -Wno-div-by-zero -Wempty-body -Wenum-compare -Wno-endif-labels -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wignored-qualifiers -Winit-self -Winline -Wno-int-to-pointer-cast -Wno-invalid-offsetof -Winvalid-pch -Wunsafe-loop-optimizations -Wlogical-op -Wlong-long -Wmain -Wmissing-braces -Wmissing-field-initializers -Wmissing-format-attribute -Wmissing-include-dirs -Wmissing-noreturn -Wno-mudflap -Wno-multichar -Wnonnull -Wno-overflow -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded -Wparentheses -Wpointer-arith -Wredundant-decls -Wreturn-type -Wsequence-point -Wshadow -Wsign-compare -Wsign-conversion -Wstack-protector -Wstrict-aliasing=1 -Wstrict-overflow=5 -Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand -Wsystem-headers -Wtrigraphs -Wtype-limits -Wundef -Wuninitialized -Wunknown-pragmas -Wno-pragmas -Wunreachable-code -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wvariadic-macros -Wvla -Wvolatile-register-var -Wwrite-strings
于 2013-12-21T16:30:36.867 に答える
7

Gcc 4.3+ には -Q --help=warnings が追加されました。 --help=warnings,C を指定して、C 関連の警告のみを出力することもできます。

これを利用するために m4 モジュールを作成しました (clang の -Weverything もサポートしています)。wget_manywarnings.m4を参照してください。

使い方はとても簡単で、基本的にモジュールはすべての警告フラグをオンにします。また、必要に応じて警告を削除します。一部の警告は非常に冗長です。例: configure.ac

autotools を使用しない場合は、m4 モジュールで無効になっているすべての警告をオンにするコードが見つかります。これは、基本的に awk を介してパイプされた gcc 呼び出しです。

flags="-Wall -Wextra -Wformat=2 "$(gcc -Wall -Wextra -Wformat=2 -Q --help=warning,C|awk '{ if (($2 == "[disabled]" || $2 == "") && $1!~/=/ && $1~/^-W/&& $1!="-Wall") print $1 }'

于 2016-11-11T21:32:56.460 に答える
3

このページから:

一部の警告フラグは、によって暗示されていないことに注意してください-Wall。それらのいくつかは、ユーザーが一般的に疑わしいとは思わないが、時々あなたがチェックしたいと思うかもしれない構造について警告します。他の人は、場合によっては避ける必要がある、または避けるのが難しい構造について警告し、警告を抑制するためにコードを変更する簡単な方法はありません。それらのいくつかはによって有効にされますが-Wextra、それらの多くは個別に有効にする必要があります。

問題はどれかということだと思います。おそらく、-Wで始まるすべての行についてそのページをgrepして、警告フラグの完全なリストを取得することができます。-Wall次に、それらをおよびの下のリストと比較します-Wextra-Wpedanticあなたは明らかにもっと衒学者になりたいと思っていますが、それもあります= )

于 2012-07-30T03:00:25.747 に答える
3

そして、このリストが包括的なものかどうかはまだわかりません.

おそらくそうですが、100% 包括的である唯一のリストは、コンパイラの実際のソースです。しかし、GCCは大きいです!また、すべてのコマンド ライン パラメーターが 1 か所に集められているのか、それとも複数のソース ファイルに分散されているのかはわかりません。また、いくつかの警告はプリプロセッサ、いくつかは実際のコンパイラ、そしていくつかはリンカ (完全に別のプログラムであり、binutils パッケージにあります) に関するものであるため、それらはおそらく分散していることに注意してください。

于 2012-07-30T06:03:08.923 に答える