我想启用GCC拥有的所有警告。(你会认为这很容易…)
你可能会想-墙可能会管用,但不是!你还需要-沃特。 你可能会想-Wextra可能会奏效,但不是!并不是这里列出的所有警告(例如,-Wshadow)都可以通过此命令启用。我仍然不知道这个列表是否全面。
我如何告诉GCC启用(没有if's, and's, or but's!)它所具有的所有警告?
我想启用GCC拥有的所有警告。(你会认为这很容易…)
你可能会想-墙可能会管用,但不是!你还需要-沃特。 你可能会想-Wextra可能会奏效,但不是!并不是这里列出的所有警告(例如,-Wshadow)都可以通过此命令启用。我仍然不知道这个列表是否全面。
我如何告诉GCC启用(没有if's, and's, or but's!)它所具有的所有警告?
当前回答
我仍然不知道这个列表是否全面。
它可能是,但唯一100%全面的列表是编译器的实际源代码。然而,GCC很大!我不知道所有命令行参数是收集在一个地方还是分散在几个源文件中。还要注意,一些警告是针对预处理器的,一些是针对实际编译器的,还有一些是针对链接器的(链接器是一个完全独立的程序,可以在binutils包中找到),因此它们很可能是分散的。
其他回答
从本页开始:
注意,一些警告标志不是由-Wall暗示的。其中一些 警告用户通常不考虑的结构 有问题,但偶尔你可能想检查一下; 其他人则对一些必要的或难以避免的短语提出警告 有些情况下,并没有简单的方法来修改代码来抑制 的警告。其中一些是通过-Wextra实现的,但大多数是 必须单独启用。
我想问题是哪些?也许您可以为该页面中所有以-W开头的行进行grep,并获得警告标志的完整列表。然后将它们与-Wall和-Wextra下面的列表进行比较。还有-Wpedantic,尽管你显然想要更迂腐=)
在所有警告都启用的情况下编程是不可能的(除非您打算忽略它们,但那又何必呢?)例如,让我们假设您使用以下标志集:- wstrict - prototyping -Wtraditional。
即使启用了两个警告,下面的程序也会报错。
/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
我同意前面的回答,字面上启用所有警告可能没有好处,但是GCC确实提供了一种相当方便的方法来实现这一点。命令
gcc -Q --help=warning
提供所有受支持的警告选项的列表,并提供有关这些选项是否处于活动状态的信息。顺便说一下,这可以用来找出哪些选项是(不)启用的,例如-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++ -Wempty-body -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来避免这些问题。
有人创建了一组工具,用于为给定的GCC或Clang版本确定完整的警告集。
对于GCC,从该工具提供的完整警告列表复制到编译器版本似乎是确保所有警告都被打开的唯一方法,因为(与Clang不同)GCC不提供-Weverything。
该工具似乎解析了GCC源代码中的实际c.opt文件,因此其结果应该是确定的。
存储库还包含为大多数GCC和Clang版本(目前是Clang 3.2到3.7以及GCC 3.4到5.3)生成的警告列表的文本文件。
我仍然不知道这个列表是否全面。
它可能是,但唯一100%全面的列表是编译器的实际源代码。然而,GCC很大!我不知道所有命令行参数是收集在一个地方还是分散在几个源文件中。还要注意,一些警告是针对预处理器的,一些是针对实际编译器的,还有一些是针对链接器的(链接器是一个完全独立的程序,可以在binutils包中找到),因此它们很可能是分散的。