2016-07-11 111 views
6

Ho un file .c molto semplice, con alcuni bug ovvi al suo interno.scan-build make non rileva alcun bug

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

Sto cercando di utilizzare lo strumento di analisi del codice statico di clang (scan-build) per rilevare gli errori. Quando eseguo lo strumento direttamente sui file, come ad esempio utilizzando il seguente comando:

scan-costruire g ++ -o 1 1.c

faccio ottenere l'output destinato, tra cui un avvertimento dal compilatore che menziona la divisione per 0.

scan-build: Usando '/usr/lib/llvm-3.8/bin/clang' per l'analisi statica

1.c: In funzione 'int test2 (int) ': 1.c: 16: 11: warning: divisione per zero [-Wdiv-by-zero] return 5/(x-x); ^

1.c: 16: 11: avviso: divisione per ritorno zero 5/(x-x);

~^~~~~~ 1 avviso generato. scan-build: 1 bug trovato. scan-build: eseguire 'scan-view/tmp/scan-build-2016-07-11-152043-3028-1' per esaminare le segnalazioni di bug.

Ora, sto provando a inserire questo comando in un Makefile molto semplice. Il contenuto della mia Makefile sono:

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

Tuttavia, ogni volta che corro Scan-costruire con marca, utilizzando il seguente comando:

scan-build fanno

ho ancora ottenere il avviso dal compilatore, ma non lo strumento di scansione!

scan-build: Usando '/usr/lib/llvm-3.8/bin/clang' per l'analisi statica

g ++ -o 1 1.c

1.c: In funzione ' int test2 (int) ':

1.c: 16: 11: warning: divisione per zero [-Wdiv-by-zero] return 5/(xx);

^scan-build: rimozione directory '/ tmp/scan-build-2016-07-11-152326-3055-1' perché non contiene report. scan-build: nessun bug trovato.

Ho osservato lo stesso comportamento in entrambi i file C e C++. Vedo che qualcuno si era imbattuto in un similar error nel passato (2012), tuttavia la risposta proposta non sembra funzionare e sembra riferirsi solo ai file C++. Qualche indizio?

risposta

3

scan-build sostituisce la variabile CC.Usalo nel vostro makefile

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

e funziona

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

E, infatti, che è stato il problema che mi ha tenuto bugging per l'ultimo paio d'ore ... Grazie mille! – user307976