2016-07-11 15 views
6

Mam bardzo prosty plik .c z kilkoma oczywistymi błędami wewnątrz niego.scan-build make nie wykrywa żadnych błędów

#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"); 
} 

Próbuję użyć narzędzia statycznego analizatora kodu klang (scan-build) do wykrywania błędów. Kiedy uruchomić narzędzie bezpośrednio na plikach, na przykład za pomocą następującego polecenia:

skanowania budować g ++ -o 1 1.C

zrobić uzyskać zamierzony wyjście, w tym ostrzeżenia od kompilatora, który wspomina o dzielenie przez 0.

scan-build: Korzystanie '/usr/lib/llvm-3.8/bin/clang' do analizy statycznej

1.C: W funkcji „int test2 (int) ": 1.c: 16: 11: ostrzeżenie: dzielenie przez zero [-Wdiw-przez-zero] powrót 5/(x-x); ^

1.c: 16: 11: ostrzeżenie: Podział przez z powrotem powrót 5/(x-x);

~^~~~~~ 1 wygenerowane ostrzeżenie. scan-build: znaleziono 1 błąd. scan-build: Uruchom "scan-view/tmp/scan-build-2016-07-11-152043-3028-1", aby sprawdzić raporty o błędach.

Teraz próbuję umieścić to polecenie w bardzo prostym pliku Makefile. Zawartość moim Makefile są:

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

Jednak gdy uruchamiam skanowanie budować z marki, za pomocą następującego polecenia:

scan-build zrobić

nadal uzyskać ostrzeżenie od kompilatora, ale nie narzędzie do skanowania!

scan-build: Używanie '/usr/lib/llvm-3.8/bin/clang' do analizy statycznej

g ++ -o 1 1.C

1.C: W funkcji ' int test2 (int) ':

1.c: 16: 11: ostrzeżenie: dzielenie przez zero [-Wdiw-przez-zero] powrót 5/(xx);

^scan-build: Usunięcie katalogu '/ tmp/scan-build-2016-07-11-152326-3055-1' ponieważ nie zawiera żadnych raportów. scan-build: Nie znaleziono błędów.

Obserwowałem to samo zachowanie zarówno w plikach C, jak i C++. Widzę, że ktoś kiedyś spotkał się z similar error, jednak proponowana odpowiedź wydaje się nie działać i wydaje się, że odnosi się tylko do plików C++. Jakieś wskazówki?

Odpowiedz

3

scan-build działa przez podstawienie zmiennej CC.Używać go w swoim makefile

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

i działa

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

I rzeczywiście był to problem, który utrzymuje podsłuch mnie przez ostatnie kilka godzin ... Dzięki dużo! – user307976

Powiązane problemy