cormoran's note


cormoran

競技プログラミング・電子工作・ロボットなどで遊びます



Recent Post




clang の警告オプションについて

今までとりあえず-Wallをつけていたけど、他にも役立つ警告がいろいろあった。

環境

  • Mac OS X El Capitan (10.11.6)
  • clang 3.8.0 (brew install llvm38 で インストール)

主な警告オプション一覧

clangのコマンドでもどうにかすれば見られるのかもしれないが、よくわからない。ドキュメントも見たが、詳細は見つからなかったので適当にWebから探した。

ここの階層構造ここの一覧を対応させて見るのがわかりやすかった。また、zshの補完で説明も含めて全部出てきたのでそれも参考にした。

-W

This switch is deprecated; use -Wextra instead らしい 効果は-Wextraと同じ

-Wall

allとか言ってるから全部のように見えるけど、clangが持ってる警告オプションの半分くらいしか有効にならない。gccのWallの定義に合わせたとか。ここに詳しい話が載っている。

-Wextra

Wallを含んでいるのだ思っていたがそうではなかった

Wsign-compare, Wunused-parameter などが有効になる。これらはWallには含まれていない。

-Weverything

(本当に)全ての警告オプションを有効にする。これが一番強い。

-Werror

警告をエラーとして扱う

-Wno-hoge

hogeの警告を無効にする

Wallでは有効にならない、いい感じのオプション

-Weverythingでコンパイルするとsize_tとintとかを全部警告してきてうるさいのだが、かなり使えそうな警告もあった。

-Wfloat-equal

浮動小数点を==で比較するのを警告してくれる

-Wshadow

ローカル変数の名前が外のスコープの変数とかぶっていたら警告してくれる。

下のようにループ変数名の重複を警告してくれるのでとても良さそう。

for(int i = 0; i < 10; i++) {
    for(int j = 0; j < 10; j++) {
        for(int i = 0; i < 10; i++) {
                
        }
    }
}
clang++ a.cpp -Weverything
a.cpp:15:21: warning: declaration shadows a local variable [-Wshadow]
for(int i = 0; i < 10; i++) {
        ^
a.cpp:13:13: note: previous declaration is here
for(int i = 0; i < 10; i++) {
        ^
1 warning generated.

使うことにした警告オプション

とりあえず-Weverythingで全部のせにして、使っていく中で邪魔なものを消していくことにした。

既存のコードをいくつかコンパイルしてみて現状以下のような感じになった。

競技プログラミングで使うという観点から選んだので、開発等で使うなら-Wnoしないほうが良さそうなものもいくつか無効にしている。

clang++ -std=c++14 \
-Weverything \
-Wno-old-style-cast \
-Wno-missing-prototypes \
-Wno-c++98-compat-pedantic \
-Wno-exit-time-destructors \
-Wno-global-constructors \
-Wno-sign-conversion \
-Wno-missing-variable-declarations \
-Wno-unused-macros \
-Wno-unused-const-variable

無効化したオプションの簡単な説明

オプション 説明
-Wno-old-style-cast (int) みたいなキャスト
-Wno-missing-prototypes プロトタイプ宣言がない関数
-Wno-c++98-compat-pedantic c++98互換でない(vector> みたいな)もの
-Wno-exit-time-destructors デストラクタを持つグローバル変数みたいなもの(?)
-Wno-global-constructors コンストラクタを持つグローバル変数(?)
-Wno-sign-conversion singed, unsigned 間の非明示的な変換 配列の添字にint使った時とかに怒られる
-Wno-missing-variable-declarations extern 宣言のないグローバル変数(?)
-Wno-unused-macros 使用されていないマクロ
-Wno-unused-const-variable 使用されていないconst変数

参考

comments powered by Disqus