2010-04-27 36 views
17

Tôi đang tìm trình kiểm tra tĩnh miễn phí cho mã C99 (bao gồm cả phần mở rộng GCC) với khả năng nói rõ ràng "các macro tiền xử lý này luôn được xác định".Trình kiểm tra tĩnh miễn phí cho mã C99

Tôi cần phần cuối cùng vì tôi đang biên dịch mã nhúng cho một bộ xử lý đích. Trình biên dịch (dựa trên bộ vi xử lý C32, GCC của Microchip) đặt macro dựa trên bộ xử lý được chọn, sau đó được sử dụng trong các tệp tiêu đề PIC32 để chọn tệp tiêu đề cụ thể cho bộ xử lý để bao gồm. cppcheck do đó không thành công vì nó phát hiện 30 khác nhau #ifdef s được sử dụng để chọn một trong nhiều bộ vi xử lý PIC32 có thể, cố gắng phân tích tất cả các kết hợp có thể của những cộng với tất cả các #define s khác, và không thành công.

Ví dụ, nếu splint có thể xử lý mã C99, tôi sẽ sử dụng

splint -D__PIC32_FEATURE_SET__=460 -D__32MX460F512L__ \ 
-D__LANGUAGE_C__ -I/path/to/my/includes source.c 

Một vấn đề nữa là trình biên dịch PIC32 toolchain được gọi pic32-gcc và không chỉ gcc, mặc dù tôi vẫn chưa nhận được đến cần phải tính đến điều này.

Cập nhật # 1 - Một điều tôi quan tâm, nhưng là trực giao với câu hỏi này, là tích hợp Eclipse (thật tuyệt nếu không phải viết một makefile cho 30 đơn vị biên dịch). Tôi hỏi về điều này trên Eclipse forums (mặc dù các cuộc thảo luận có nhiều hơn về hội nhập vào Eclipse). Không có gì đột phá.

Update # 2 - chỉ cần cố gắng scan-build từ clang, sử dụng:

scan-build --use-cc=/usr/local/bin/pic32-gcc make -B -k all 

... (còn nếu không có sự --use-cc cờ) nhưng tất cả tôi nhận được các điển hình xây dựng đầu ra, một ví dụ trong số đó là :

Building file: ../src/MoreMath.c 
Invoking: PIC C32 C Compiler 
pic32-gcc -D__DEBUG -I/usr/local/pic32-libs/include -O0 -Wall -c -fmessage-length=0 -std=gnu99 -Werror-implicit-function-declaration -MMD -MP -MF"src/MoreMath.d" -MT"src/MoreMath.d" -mprocessor=32MX460F512L -D__DEBUG -g -o"src/MoreMath.o" "../src/MoreMath.c" 
Finished building: ../src/MoreMath.c 

... và ở cuối:

Building target: MyBinary.elf 
Invoking: PIC C32 C Linker 
pic32-gcc -Wl,-Map,MyBinary.map -mprocessor=32MX460F512L --defsym=__MPLAB_DEBUG=1 -o"MyBinary.elf" <<ALL OF MY *.o FILES HERE>> 
Finished building target: MyBinary.elf 

scan-build: Removing directory '/tmp/scan-build-2010-06-21-1' because it contains no reports. 

Vì vậy, hoặc mã của tôi là hoàn hảo theo scan-build hoặc không hoạt động. Tôi không chắc một thử nghiệm tốt có thể là gì nếu nó hoạt động.

+0

Bạn nên thêm quy định của mình để được sử dụng trong Eclipse cho câu hỏi của bạn nếu đó thực sự là một yêu cầu cho giải pháp của bạn. –

+0

Không, nó sẽ là một tiền thưởng thêm. Tôi sẽ chỉnh sửa câu hỏi để làm rõ hơn. Tôi vẫn còn wokring về việc 'quét-build' để làm việc với các toolchain PIC32, và nếu tôi làm, tôi sẽ chấp nhận câu trả lời dưới đây. – detly

+0

@Adam Davis - Tôi sẽ tinh chỉnh câu hỏi để nhấn mạnh hơn việc sử dụng chuỗi công cụ PIC32 của tôi, nhưng tôi không biết liệu điều này có ảnh hưởng đến động lực của bạn để đưa ra tiền thưởng hay không. Hãy cho tôi biết nếu bạn muốn tôi chờ đợi. – detly

Trả lời

5

Clang's static analyzer sẽ hoạt động.

Tùy chọn khác với mã nguồn #defines là bạn có thể chạy cpp qua mã nguồn bằng một số báo cáo tiền xử lý, sau đó chạy mã kết quả đó thông qua một trình phân tích tĩnh.

+0

Tôi nghĩ rằng 'quét-xây dựng' là về tốt như tôi có thể nhận được. Tôi đang phát triển theo Eclipse và sử dụng trình xây dựng nội bộ (ví dụ: không có makefile rõ ràng), và tôi không nghĩ rằng có bất kỳ tích hợp clang nào cho CDT Eclipse. Nó có thể là giá trị chuyển sang một dự án dựa trên makefile. – detly

+0

Than ôi, tôi không thể nhìn thấy một cách để có được 'quét-xây dựng' (hoặc bất kỳ công cụ Clang) để làm việc với Eclipse. – detly

+2

@detly: Tại sao trên trái đất là một lập trình viên thành thạo C như bản thân bạn bị ràng buộc với một sự hủy diệt vô lý như Eclipse? –

3

Bạn chỉ có thể thêm một số mã như thế này để đầu tiêu đề của bạn mà đảm bảo rằng nó được định nghĩa:

#ifndef MACRO_I_NEED 
#error "MACRO_I_NEED should be defined" 
#define MACRO_I_NEED // to appease cppcheck 
#endif 
+1

Tôi sẽ không cần phải làm điều đó cho mỗi tập tin nguồn duy nhất mặc dù? – detly

+1

@detly: Không nhất thiết - nếu bạn có tệp tiêu đề mà mọi tệp bao gồm (chẳng hạn như tiêu đề được biên dịch trước), thì bạn có thể đặt nó ở trên đầu trang đó. –

1

này có thể không trực tiếp cung cấp cho bạn các giải pháp, nhưng bạn có thể xem xét việc có một cái nhìn để Coverity, là một trình phân tích cú pháp tĩnh độc quyền, nhưng đó là miễn phí cho các dự án hệ điều hành. Nó sẽ làm công việc liên quan đến nhu cầu của bạn!

Chúc mừng!

+0

Nó không phải là một dự án PMNM. – detly

1

Bạn có thể sử dụng công cụ như sunifdef để xử lý trước một phần mã nguồn theo các macro được xác định giả định.Bạn sẽ phải tạo bản sao của tiêu đề hệ thống và thư viện bị ảnh hưởng bởi những tiêu đề đó và xử lý chúng. Sau đó, khi thực hiện phân tích tĩnh, bạn sẽ chỉ định một đường dẫn bao gồm khác trỏ đến các tiêu đề đã được xử lý của bạn.

+0

Coan (http://coan2.sourceforge.net/) dường như là ngã ba/mở rộng mới nhất của bộ công cụ unifdef –

2

Thay vì sử dụng tính năng quét-xây dựng bằng tiếng lóng, hãy cân nhắc trao đổi toàn bộ gcc! Hỗ trợ C của Clang ổn định (và cố gắng hết sức để mô phỏng gcc), và nên xử lý mã của bạn tốt.

Hãy thử một cái gì đó như make -j3 CC=clang và xem điều gì sẽ xảy ra!

PS. Cú pháp đó có thể hoàn toàn sai. Đã không sử dụng makefiles trong độ tuổi (CMake là btw tuyệt vời).

+2

cmake thật khủng khiếp! –

+0

Nó không hỗ trợ tùy chọn '-MT', có nghĩa là tôi phải viết lại rất nhiều makefiles. Hiện tại, bản dựng sử dụng các tệp tin độc lập - các tệp '.d' - chứa các phụ thuộc đầu trang cho mỗi tệp' .o'. Nó sẽ mất một lúc trước khi tôi có thể kiểm tra điều này. – detly

+0

@detly, tạo các tệp phụ thuộc và cắt xử lý của chúng (chủ yếu là các mẫu, tôi giả sử) trong tệp Makefile của bạn)? – vonbrand

2

Tùy thuộc vào phân tích thực tế bạn muốn chạy trên mã của mình, bạn có thể xem Frama-C. Nó sử dụng bất cứ bộ tiền xử lý C nào mà bạn cho nó biết, vì vậy bạn có thể sử dụng CPP của PIC32 nếu muốn.

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