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
.
Nguồn
2010-08-15 10:06:40
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
@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? –
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