2016-07-11 2 views
6

У меня очень простой .c файл с некоторыми явными ошибками внутри него.scan-build make не обнаруживает ошибок

#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) для обнаружения ошибок. Когда я бег инструмента непосредственно на файлах, как, например, с помощью следующей команды:

сканирования построить г ++ -o 1 1.c

Я получаю намеченный выход, включая предупреждение от компилятора, который упоминает деление на 0.

скан-сборки: Использование '/usr/lib/llvm-3.8/bin/clang' для статического анализа

1.c: В функции «Int test2 (int) ': 1.c: 16: 11: предупреждение: деление на ноль [-Wdiv-by-zero] return 5/(x-x); ^

1.c: 16: 11: предупреждение: деление на нулевой возврат 5/(x-x);

~^~~~~~ 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 

Однако всякий раз, когда я запускаю сканирование, строить с замыкающими, используя следующую команду:

сканирования сборка делает

Я до сих пор получаю предупреждение от компилятора, но не инструмент построения сканирования !!!

сканирования сборки: Используя '/usr/lib/llvm-3.8/bin/clang' для статического анализа

г ++ -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++. Я вижу, что кто-то встретил similar error в прошлом (2012), однако предлагаемый ответ, похоже, не работает и, похоже, относится только к файлам на C++. Любые подсказки?

ответ

3

scan-build работает, заменяя переменную CC.Использовать его в вашем 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. 
+0

И действительно это была проблема, которая хранится пристанет меня за последние пару часов ... Большое спасибо! – user307976

Смежные вопросы