11

非常に単純な .c ファイルがあり、その中にいくつかの明らかなバグがあります。

#include <stdio.h>

struct S {
  int x;
};

void f(struct S s){
}

void test() {
  struct S s;
  f(s); // warn
}

int test2(int x){
  return 5/(x-x); // warn
}

int main(){
  test();
  test2(532);
  printf("Hej\r\r");
}

エラーを検出するために、clang の静的コード アナライザー ツール (scan-build) を使用しようとしています。たとえば、次のコマンドを使用して、ファイルに対してツールを直接実行すると、次のようになります。

スキャンビルド g++ -o 1 1.c

0 による除算に言及するコンパイラからの警告を含め、意図した出力が得られます。

scan-build: 静的解析に「/usr/lib/llvm-3.8/bin/clang」を使用

1.c: 関数 'int test2(int)' 内: 1.c:16:11: 警告: ゼロ除算 [-Wdiv-by-zero] return 5/(xx); ^

1.c:16:11: 警告: 0 による除算は 5/(xx) を返します。

~^~~~~~ 1 件の警告が生成されました。scan-build: 1 件のバグが見つかりました。scan-build: 「scan-view /tmp/scan-build-2016-07-11-152043-3028-1」を実行して、バグ レポートを調べます。

今、私はそのコマンドを非常に単純な Makefile に入れようとしています。私の Makefile の内容は次のとおりです。

all: 1.c
    g++ -o 1 1.c
clean:
    rm -f *.o 1

ただし、次のコマンドを使用して、make で scan-build を実行するたびに:

スキャンビルドメイク

コンパイラからはまだ警告が表示されますが、スキャンビルド ツールからは表示されません!!!

scan-build: 静的解析に「/usr/lib/llvm-3.8/bin/clang」を使用

g++ -o 1 1.c

1.c: 関数 'int test2(int)' 内:

1.c:16:11: 警告: ゼロ除算 [-Wdiv-by-zero] return 5/(xx);

^ scan-build: レポートが含まれていないため、ディレクトリ '/tmp/scan-build-2016-07-11-152326-3055-1' を削除しています。scan-build: バグは見つかりませんでした。

C ファイルと C++ ファイルの両方で同じ動作を確認しました。過去(2012年)に誰かが同様のエラーに遭遇したことがわかりましたが、提案された回答は機能していないようで、とにかくC++ファイルのみを参照しているようです。手がかりはありますか?

4

1 に答える 1

10

scan-buildCC変数を代入することで機能します。あなたのmakefileでそれを使用してください

CC=g++
all: 1.c
        $(CC) -o 1 1.c
clean:
        rm -f *.o 1

そしてそれは動作します

scan-build: Using '/usr/bin/clang' for static analysis
/usr/share/clang/scan-build/ccc-analyzer -o 1 1.c
1.c:16:17: warning: Division by zero
        return 5/(x-x); // warn
           ~^~~~~~
1 warning generated.
scan-build: 1 bugs found.
scan-build: Run 'scan-view /tmp/scan-build-2016-07-11-160529-5951-1' to  examine bug reports.
于 2016-07-11T14:07:02.827 に答える