2010-08-11 22 views
12

Tôi muốn xem một đoạn mã nhỏ nhưng đầy đủ sẽ làm cho máy phân tích tĩnh của Clang phải phàn nàn. Động cơ của tôi chủ yếu là tôi đang cố gắng làm cho nó hoạt động trên mã PIC32 của tôi, và tôi cần một cách để phân biệt giữa "tất cả các mã là tốt" và "nó không thực sự làm bất cứ điều gì". Đó cũng là một phần tò mò, vì tôi dường như không thể tự mình đưa ra một ví dụ đơn giản.Ví dụ mã để kích hoạt phân tích tĩnh của Clang

C89/ANSI hoặc C99 là tốt và lý tưởng nhất là tôi muốn thấy thiết bị này bị rò rỉ bộ nhớ đơn giản. sử dụng của tôi là

clang --analyze test.c 

Trả lời

11

Tôi tìm thấy một "lỗi" trong mã của tôi (người duy nhất ;-) kích hoạt bằng cách đó, và đó không phải được phát hiện bởi -Wall. Tôi đã nấu nó xuống sau

struct elem { 
    struct elem *prev; 
    struct elem *next; 
}; 

#define ELEM_INITIALIZER(NAME) { .prev = &(NAME), .next = &(NAME), } 

struct head { 
    struct elem header; 
}; 

#define HEAD_INITIALIZER(NAME) { .header = ELEM_INITIALIZER(NAME.header) } 

int main(int argc, char ** argv) { 
    struct head myhead = HEAD_INITIALIZER(myhead); 
} 

Đây là một triển khai tương đối thẳng về phía trước của danh sách được liên kết, nhưng điều này không quan trọng ở đây. Biến myhead không được sử dụng trong một ứng dụng thông thường của thuật ngữ, nhưng đối với trình biên dịch nó được sử dụng kể từ bên trong trình khởi tạo địa chỉ của một trường được lấy.

clang phân tích một cách chính xác này như

/tmp 11:58 <722>% clang --analyze test-clang.c 
test-clang.c:25:15: warning: Value stored to 'myhead' during its initialization is never read 
    struct head myhead = HEAD_INITIALIZER(myhead); 
      ^  ~~~~~~~~~~~~~~~~~~~~~~~~ 
1 diagnostic generated. 

Edit: Tôi tìm thấy một số khác cũng phát hiện ngăn xếp bộ nhớ phổ biến vũ khí

char const* myBuggyFunction(void) { 
    return (char[len + 1]){ 0 }; 
} 

này không được phát hiện bởi gcc, open64 hoặc clang với -Wall, nhưng bởi clang với --analyze.

+0

Công việc, cảm ơn :) Tôi phải nói, tôi nghĩ ra những lỗ hổng bộ nhớ đẫm máu nhất và sáng tạo nhất mà tôi có thể mơ ước, và nó cho phép tất cả chúng trôi qua. Rõ ràng là nó biết đủ để biết tôi đã thử nghiệm nó. – detly

+0

@detly: đã được vui vẻ, học được tiếng kêu của nó :) cho sự tò mò của tôi những gì đang rò rỉ trong một bối cảnh phân tích tĩnh? –

+0

Vâng tôi không chắc chắn 100%, nhưng tôi đã ấn tượng rằng nhiều công cụ phân tích tĩnh, bao gồm cả tiếng lóng, có thể phát hiện các vấn đề bộ nhớ thời gian chạy tiềm năng (chẳng hạn như 'p = malloc (...); p = q;') . Tôi có thể sai về điều đó. – detly

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