2016-07-11 10 views
6

Tôi có một tập tin rất đơn giản .c, với một số lỗi rõ ràng bên trong nó.quét-xây dựng làm cho không phát hiện bất kỳ lỗi

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

Tôi đang cố gắng sử dụng công cụ phân tích mã tĩnh của công cụ quét (scan-build) để phát hiện lỗi. Khi tôi chạy công cụ trực tiếp trên các tập tin, ví dụ như sử dụng lệnh sau:

quét-xây dựng g ++ -o 1 1.c

tôi làm nhận được đầu ra dự định, trong đó có một cảnh báo từ trình biên dịch đề cập đến việc phân chia bởi 0.

quét-xây dựng: Sử dụng '/usr/lib/llvm-3.8/bin/clang' để phân tích tĩnh

1.c: Trong chức năng 'int test2 (int) ': 1.c: 16: 11: cảnh báo: chia cho số không [-Wdiv-by-zero] trả về 5/(x-x); ^

1.c: 16: 11: cảnh báo: Chia cho số không trả về 5/(x-x);

~^~~~~~ 1 cảnh báo được tạo. scan-build: tìm thấy 1 lỗi. scan-build: Chạy 'scan-view/tmp/scan-build-2016-07-11-152043-3028-1' để kiểm tra các báo cáo lỗi.

Bây giờ, tôi đang cố gắng đưa lệnh đó vào một Makefile rất đơn giản. Nội dung của Makefile của tôi là:

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

Tuy nhiên, bất cứ khi nào tôi chạy quét-xây dựng với thực hiện, sử dụng lệnh sau:

quét-build làm

tôi vẫn nhận được cảnh báo từ trình biên dịch, nhưng không phải công cụ quét-xây dựng!

quét-xây dựng: Sử dụng '/usr/lib/llvm-3.8/bin/clang' để phân tích tĩnh

g ++ -o 1 1.c

1.c: Trong chức năng ' int test2 (int) ':

1.c: 16: 11: cảnh báo: chia cho số không [-Wdiv-by-zero] trả về 5/(xx);

^quét-xây dựng: Xóa thư mục '/ tmp/scan-build-2016-07-11-152326-3055-1' bởi vì nó không chứa báo cáo. scan-build: Không tìm thấy lỗi nào.

Tôi đã quan sát hành vi tương tự trong cả tệp C và C++. Tôi thấy rằng ai đó đã đi qua một similar error trong quá khứ (2012), tuy nhiên câu trả lời được đề xuất dường như không hoạt động và dường như chỉ đề cập đến tệp C++. Bất kì manh mối nào?

Trả lời

3

scan-build hoạt động bằng cách thay thế biến số CC.Sử dụng nó trong makefile của bạn của bạn

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

và nó hoạt động

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

Và quả thực đó là vấn đề mà giữ bugging tôi cho hai vợ chồng cuối cùng của giờ ... Cảm ơn rất nhiều! – user307976

Các vấn đề liên quan