18

Clang の静的アナライザーがエラーを出す原因となる、小さくても完全なコード スニペットを見たいと思います。私の動機は主に、自分の PIC32 コードで動作させようとすることであり、「すべてのコードに問題がない」ことと「実際には何もしていない」ことを区別する方法が必要です。私自身は単純な例を思いつくことができないように見えるので、これは好奇心でもあります。

C89/ANSI または C99 で問題ありません。理想的には、単純なメモリ リークが検出されるようにしたいと考えています。私の使い方は

clang --analyze test.c
4

1 に答える 1

14

私のコードに「バグ」が見つかりました(唯一のもの;-)それによってトリガーされ、それはによって検出されません-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 };
}

これはgccopen64またはclangwith-Wallでは検出されませんが、clangwithによって検出され--analyzeます。

于 2010-08-15T10:06:40.993 に答える