私のコードに「バグ」が見つかりました(唯一のもの;-)それによってトリガーされ、それはによって検出されません-Wall
。私はそれを次のように調理しました
struct elem {
struct elem *prev;
struct elem *next;
};
#define ELEM_INITIALIZER(NAME) { .prev = &(NAME), .next = &(NAME), }
struct head {
struct elem header;
};
#define HEAD_INITIALIZER(NAME) { .header = ELEM_INITIALIZER(NAME.header) }
int main(int argc, char ** argv) {
struct head myhead = HEAD_INITIALIZER(myhead);
}
これは、リンクされたリストの比較的単純な実装ですが、ここでは重要ではありません。変数myhead
は、この用語の常識的な適用では使用されませんが、コンパイラでは、初期化子内でフィールドのアドレスが取得されるため、変数が使用されます。
clang
これを次のように正しく分析します
/tmp 11:58 <722>% clang --analyze test-clang.c
test-clang.c:25:15: warning: Value stored to 'myhead' during its initialization is never read
struct head myhead = HEAD_INITIALIZER(myhead);
^ ~~~~~~~~~~~~~~~~~~~~~~~~
1 diagnostic generated.
編集:スタックメモリの急増も検出する別のものを見つけました
char const* myBuggyFunction(void) {
return (char[len + 1]){ 0 };
}
これはgcc
、open64
またはclang
with-Wall
では検出されませんが、clang
withによって検出され--analyze
ます。