我想使-从字面上- 所有 GCC有警告。 (你会觉得它很容易...)
你会觉得
-Wall
可能做的伎俩,但没了! 还需要-Wextra
。你会觉得
-Wextra
可能做的伎俩,但没了! 并非所有列出的警告在这里 (例如,-Wshadow
)是由这个启用。 我仍然不知道,如果这个名单是全面的。
我如何告诉GCC启用(如果的,和的,或者不过的!没有) 所有的警告它?
我想使-从字面上- 所有 GCC有警告。 (你会觉得它很容易...)
你会觉得-Wall
可能做的伎俩,但没了! 还需要-Wextra
。
你会觉得-Wextra
可能做的伎俩,但没了! 并非所有列出的警告在这里 (例如, -Wshadow
)是由这个启用。 我仍然不知道,如果这个名单是全面的。
我如何告诉GCC启用(如果的,和的,或者不过的!没有) 所有的警告它?
你不能。
对于GCC 4.4.0本手册只适用于该版本全面,但它确实列出所有可能的警告为4.4.0。 他们不是你链接到这些网页上,比如一些特定语言的选择都在页C ++选项或OBJ - C的选项。 找到他们,你最好看选项摘要
打开一切都将包括-Wdouble-promotion
这是唯一与它实现了一个32位单精度浮点运算单元的CPU相关的float
在硬件,但模拟double
软件。 这样的计算, double
会使用软件仿真和较慢。 这是相关的一些嵌入式CPU,但完全不相干与64位浮点硬件支持现代桌面CPU。
这不是通常的另一种警告-Wtraditional
,它发出警告得很清楚形成的代码,在传统的C具有不同的含义(或不工作),如"string " "concatenation"
,或ISO C函数的定义! 难道你真的关心与30岁的编译器兼容? 你真的想编写一个警告int inc(int i) { return i+1; }
int inc(int i) { return i+1; }
?
我认为-Weffc++
是太吵是有用的,它是基于对C ++有效过时的第一版,并警告有关构建物是完全合法的C ++(和这本书的后续版本改变了方针。)我不想被警告,我没有初始化std::string
我在构造函数中成员; 它有一个默认的构造函数,做正是我想要的,我为什么要编写m_str()
调用呢? 该-Weffc++
警告,将是有益的太难编译器精确地检测(给假阴性),而不是有用的部分,如明确初始化所有成员,只是产生过多的噪音,给人误报。
吕克·丹东提供了一个很好的例子,从无用的警告-Waggregate-return
几乎肯定永远是有道理的C ++代码。
例如,你真的不希望所有的警告,你只是觉得你这样做。
通过手动,了解他们去,决定你可能要启用,试戴。 读你的编译器的手册是一件好事TM反正抄近路,使您不明白的警告是不是一个很好的主意,尤其是如果它以避免对RTFM。
任何人谁只是打开一切可能要么这样做,因为他们什么也不知道,因为或尖头发的老板说:“没有任何警告。”
一些警告是重要的,有些则不是。 你必须要区分或者你弄乱你的计划。 考虑,例如, -Wdouble-promotion
。 如果你在嵌入式系统上工作,你可能想这一点; 如果您是在桌面系统上工作,你可能不知道。 而且你要-Wtraditional
? 我对此表示怀疑。
编辑:又见-Wall,所有使所有警告其关闭为WONTFIX。
编辑2:响应DevSolar的约需要使用不同的警告取决于编译器版本生成文件的投诉,如果-Wall -Wextra
不适合那么它是不是很难用编译器特定的和特定版本的CFLAGS:
compiler_name := $(notdir $(CC))
ifeq ($(compiler_name),gcc)
compiler_version := $(basename $(shell $(CC) -dumpversion))
endif
ifeq ($(compile_name),clang)
compiler_version := $(shell $(CC) --version | awk 'NR==1{print $$3}')
endif
# ...
wflags.gcc.base := -Wall -Wextra
wflags.gcc.4.7 := -Wzero-as-null-pointer-constant
wflags.gcc.4.8 := $(wflags.gcc.4.7)
wflags.clang.base := -Wall -Wextra
wflags.clang.3.2 := -Weverything
CFLAGS += $(wflags.$(compiler_name).base) $(wflags.$(compiler_name).$(compiler_version))
我会与以前的答案,这可能是不利于使字面上所有警告同意,但是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标签-Waddress -Waggregate回报-Waggressive环的优化-Waliasing -Walign公地-Wampersand -Warray界-Warray-的临时-Wassign截距-Wattributes -Wbad功能铸-Wbool-比较-Wbuiltin宏重新定义的-Wc ++ - COMPAT -Wc ++ 0X-COMPAT -Wc ++ 14 COMPAT -Wc结合型-Wc90-C99-COMPAT -Wc99-C11-COMPAT -Wcast对准-Wcast-QUAL -Wchar-标-Wcharacter截断-Wchkp -Wclobbered -Wcomment -Wcompare-雷亚尔-Wconditionally支持-Wconversion -Wconversion-额外-Wconversion空-Wcoverage不匹配-Wcpp -Wctor,析构函数隐私-Wdate时间-Wdeclaration -after语句-Wdelete不完全-Wdelete-非虚析构函数-Wdeprecated -Wdeprecated申述-Wdesignated-INIT -Wdisabled优化-Wdiscarded阵列限定符-Wdiscarded限定符-Wdiv被零-Wdouble推广-Weffc ++ -Wempty体-Wendif的标签-Wenum - 比较-Wextra -Wfloat平等-Wformat-包含-NUL -Wformat-EXTRA-ARGS -Wformat-非字面-Wformat安全-Wformat,符号性 - Wformat-2000年-Wformat-零长度-Wfree-非堆对象-Wfunction消去-Wignored限定符-Wimplicit -Wimplicit函数声明-Wimplicit-INT -Wimplicit接口-Wimplicit-过程-Wincompatible指针类型 - Winherited-可变参数-构造函数-Winit自-Winline -Wint转换-Wint到指针铸-Wintrinsic阴影-Wintrinsics-STD -Winvalid存储器模型-Winvalid-offsetof -Winvalid-PCH -Wjump-misses-初始化-Wline截断-Wliteral后缀-Wlogical - 不括号-Wlogical-OP -Wlong长-Wmain -Wmaybe,未初始化-Wmemset变调 - ARGS -Wmissing-括号-Wmissing申述-Wmissing场 - 初始化 - Wmissing-包括 - 迪尔斯-Wmissing参数型-Wmissing的原型-Wmultichar -Wnarrowing -Wnested-实习医生-Wnoexcept -Wnon模板,朋友-Wnon虚析构函数-Wnonnull -Wodr -WOLD式铸造-Wold-风格声明-WOLD风格定义-Wopenmp-SIMD -Woverflow -Woverlength串-Woverloaded虚拟-Woverride-INIT -Wpacked -Wpacked-位域-COMPAT -Wpadde d -Wparentheses -Wpedantic -Wpmf-转换-Wpointer-ARITH -Wpointer-SIGN -Wpointer到INT铸-Wpragmas -Wproperty指派默认-Wprotocol -Wreal-Q-恒定-Wrealloc-LHS -Wrealloc-LHS-所有-Wredundant-decls -Wreorder -Wreturn本地--Wreturn地址型-Wselector -Wsequence点-Wshadow -Wshadow - 伊娃-Wshift-数负-Wshift-计数溢出-Wsign-比较-Wsign宣传 - Wsized-解除分配-Wsizeof阵列参数的-Wsizeof指针-memaccess -Wstack保护器-Wstrict无效前哨-Wstrict的原型-Wstrict选择器匹配-Wsuggest属性=常数-Wsuggest属性=格式-Wsuggest-属性=不返回的-Wsuggest属性=纯-Wsuggest-最终方法-Wsuggest-最终类型-Wsuggest-倍率-Wsurprising -Wswitch -Wswitch-布尔-Wswitch默认-Wswitch-枚举-Wsync-NAND -Wsynth -Wsystem-头-Wtabs -Wtarget-寿命-Wtraditional -Wtraditional转换-Wtrampolines -Wtrigraphs -Wtype-限制-Wundeclared选择器-Wundef -Wunderflow -Wuninitialized -Wunknown pragma的-Wuns AFE循环的优化-Wunsuffixed浮动常数-Wunused -Wunused,但设置参数-Wunused,但设置变量-Wunused-伪参数-Wunused功能-Wunused标签-Wunused-本地的typedef - Wunused的宏-Wunused参数-Wunused-结果-Wunused价值-Wunused变量-Wuse - 没有只-Wuseless铸-Wvarargs -Wvariadic的宏-Wvector运行性能-Wvirtual - 移动 - 分配-Wvla - Wvolatile注册-VAR -Wwrite弦-Wzero,如无效指针常数-Wzerotrip -frequire返回语句
这现在可以用来调用GCC,即
gcc $(gcc -Q --help=warning | sed -e 's/^\s*\(\-\S*\)\s*\[\w*\]/\1 /gp;d' | tr -d '\n')
但是请注意,这会导致警告,由于一些警告选项仅是可用于某些语言(如C++
)。 这些可以通过使用一些正则表达式来避免只允许包含在当前的语言或者通过添加适当的选项-Wno-whatever
在通话结束。
这是根本不可能启用所有警告编程(除非你要忽略他们,但后来,何必呢?)。 例如,假设您可以采取以下设置标志: -Wstrict-prototypes -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不提供-Weverything
。
该工具似乎解析实际的c.opt
在GCC的源代码文件,因此它的结果应该是明确的。
该库也包含对于大多数GCC和Clang的版本(目前为3.2锵通过3.7和3.4 GCC 5.3通过)发生了警告列表的文本文件。
https://github.com/barro/compiler-warnings
GCC 4.3及更高版本现在有-Q --help =警告,你甚至可以指定--help =警告,到刚刚打印出来的c相关警告。
我只是写了M4模块利用这个(也支持铛的-Weverything),见wget_manywarnings.m4
如何使用它是非常简单的,基本模块开启每一个警告标志上。 并删除警告需要 - 一些真的很冗长。 例如: configure.ac
如果你不使用自动工具,你会发现代码打开M4模块,这基本上是gcc的呼叫通过AWK管道中的所有禁用的警告:
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 }'
从这个页面 :
需要注意的是一些警告标志不会被暗示
-Wall
。 他们中的一些警告是关于用户通常认为不会有问题的结构,但有时您可能希望检查; 其他人警告是必要的或很难避免在某些情况下结构,并没有简单的方法来修改代码以禁止这些警告。 其中一些人通过启用-Wextra
但其中许多人都必须单独启用。
我想这个问题是哪些 ? 也许你可以用grep该页面与-W开头的所有线路,并得到警告标志的完整列表。 然后比较那些在名单-Wall
和-Wextra
。 还有-Wpedantic
,但你显然希望更加迂腐仍然=)
我仍然不知道,如果这个名单是全面的。
它可能是,但毕竟是100%全面唯一上榜的是编译器的实际来源。 然而,GCC是大 ! 如果所有命令行参数被收集在一个地方或在多个源文件摊开我不知道。 还要注意的是一些警告是预处理器,对于一些实际的编译器和一些链接器(这是一个完全独立的程序,并在Binutils是发现的),因此他们极有可能被传播出去。