NF

地方で働くプログラマ

7回目:警告オプション色々

数を稼ぎます(自虐)
いや結構知らないオプション多い

-Wshadow

shadowing、つまり以前に使用されてる変数を隠す箇所を警告してくれる。

#include<stdio.h>
int main()
{
    int a = 0;
    for(int i=0; i<1; i++)
    {
        int a = 100;
        printf("%d\n", a);
    }
    printf("%d\n", a);
    return 0;
}
781469572/source.cpp:7:13: error: declaration of ‘a’ shadows a previous local [-Werror=shadow]
         int a = 100;
             ^
781469572/source.cpp:4:9: note: shadowed declaration is here
     int a = 0;

稀にこれが不具合の原因になってるところを目撃するので、結構有用な気がする。WallやWextraには含まれてないのがちょっと意外でした。

ちなみに、gccのdocによるとチェックの範囲が幾つか選べるらしい。
デフォルトでは-Wshadow=globalで、これだと警告され過ぎる場合があるとか。上の例はローカルスコープ?をチェックしたいので-Wshadow=localだけでも良い。
 
静的解析ツールでも見つけてくれそうだけど、警告レベルが低いとそのままになってたりしそうで、覚えておくと役に立つ場合があるかも。


おわり