我应该使用哪些编译标志来避免运行时错误

时间:2017-05-14 11:18:57

标签: c++ c compiler-warnings compiler-flags sequence-points

刚刚学会here -Wsequence-point comiplation标志会在代码调用UB时弹出警告。我在像

这样的声明上尝试过
int x = 1;
int y = x+ ++x;

它工作得非常好。到目前为止,我只使用gcc编译g++-ansi -pedantic -Wall。你有没有其他有用的标志来使代码更安全和健壮?

1 个答案:

答案 0 :(得分:5)

总结起来,使用这些标志:

  

-pedantic -Wall -Wextra -Wconversion

首先,我认为您不想使用Should I use "-ansi" or explicit "-std=..." as compiler flags?

中建议的-ansi标记

其次,-Wextra似乎也非常有用,如-Wextra how useful is it really?

中所述

第三,如-Wconversion

中所述,Can I make GCC warn on passing too-wide types to functions?似乎也很有用

第四,-pedantic也是帮助,  正如What is the purpose of using -pedantic in GCC/G++ compiler?中所述。

最后,在这种情况下启用-Wall应该没问题,所以我对你说的话很怀疑。

示例:

Georgioss-MacBook-Pro:~ gsamaras$ cat main.c 
int main(void)
{
    int x = 1;
    int y = x+ ++x;
    return 0;
}
Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
main.c:4:16: warning: unsequenced modification and access to 'x' [-Wunsequenced]
    int y = x+ ++x;
            ~  ^
main.c:4:9: warning: unused variable 'y' [-Wunused-variable]
    int y = x+ ++x;
        ^
2 warnings generated.
Georgioss-MacBook-Pro:~ gsamaras$ gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.1.0 (clang-802.0.38)
Target: x86_64-apple-darwin16.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

示例,版本相同:

Georgioss-MacBook-Pro:~ gsamaras$ cp main.c main.cpp
Georgioss-MacBook-Pro:~ gsamaras$ g++ -Wall main.cpp 
main.cpp:4:16: warning: unsequenced modification and access to 'x'
      [-Wunsequenced]
    int y = x+ ++x;
            ~  ^
main.cpp:4:9: warning: unused variable 'y' [-Wunused-variable]
    int y = x+ ++x;
        ^
2 warnings generated.

我的相关answer,Wall再次以类似的问题挽救了这一天。