Tôi quan tâm đến một công cụ miễn phí có thể kiểm tra tĩnh mã C++ của tôi như Lint. Bất kỳ gợi ý nào?C/C++ miễn phí thay thế cho Lint?
Trả lời
Hãy thử cppcheck
, tìm thấy ở đây: http://cppcheck.sourceforge.net/
Dưới đây là một mẫu của một số kiểm tra nó có thể thực hiện hoặc mà tôi đã sử dụng nó cho:
- chỉ số mảng nằm ngoài giới hạn
- Memory/rò rỉ tài nguyên
- Mới/xóa không chính xác
- Thất bại trong việc đặt các trình phá hủy ảo trên lớp dẫn xuất
- phân bổ mismatching và deallocation
- deallocating một con trỏ deallocated
- Sử dụng biến sau khi được deallocated/phát hành
- Kích sai lệch
- radix không hợp lệ trong cuộc gọi đến
strtol
hoặcstrtoul
- chồng chéo bộ đệm dữ liệu
- Unsigned phân chia; Kết quả có thể sai
- con trỏ bất thường số học
- Trở con trỏ đến biến mảng địa phương
- Cùng iterator được sử dụng với hai container
- sử dụng nguy hiểm của erase
- Sau pushback hoặc pushfront, iterator thể không hợp lệ
- Lỗi tràn bộ đệm
- Sử dụng nguy hiểm
strncat
, có thể tràn bộ đệm
+1 cho CppCheck. Công cụ tuyệt vời! Chỉ cần cẩn thận rằng nó * luôn luôn * trả về một mã khác không nếu nó phát hiện * bất kỳ * vấn đề (ngay cả phong cách nếu chúng được cấu hình). Nếu bạn đang sử dụng hệ thống xây dựng tự động, điều này có thể đánh dấu các bản dựng là không thành công. – MattyT
Liệu nó có thay thế lint, hoặc nó là một bổ sung? – To1ne
@ To1ne: _lint_ dùng cho mã C, _cppcheck_ là cho mã C++. –
nẹp bị lẫn lộn bởi cú pháp "mới hơn", trong đó "mới hơn" là các quy ước C++ đã được chuyển về C trong lần cuối 10 năm. –
Upps, vì vậy nẹp chỉ c? – Johan
Có, nẹp là C chỉ, và từ kinh nghiệm của tôi nó không làm được nhiều thứ mà GCC/Clang gần đây không làm. Mặc dù YMMV. – ideasman42
Có lẽ một danh sách như thế này là những gì bạn đang tìm kiếm:
http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
Dường như bạn sẽ nhận được nhiều nhất sử dụng ra khỏi Splint hoặc Uno.
nẹp không hỗ trợ C++ –
ah, đó là một điểm tốt. Tôi ước rằng tôi đã nhận ra điều đó sớm hơn. –
nẹp là thực sự bên cạnh vô ích trừ khi bạn có một phân định rõ ràng giữa mã C và C++, như quy ước sử dụng .h cho hậu tố của cả hai tiêu đề C và C++ có nghĩa là nẹp sẽ vui vẻ phun tấn cảnh báo về tệp .h đầy đủ các mẫu, lớp, v.v. mà bạn đã yêu cầu nó quét bằng '* .h'. –
Bạn có thể muốn kiểm tra dự án này:
- Vera++ dựa trên người dùng định nghĩa quy tắc (viết bằng Tcl, Python, hoặc Lua)
Và vài không được tự do người:
- QAC++
- Coverity
- Klocwork
- Abraxas CodeCheck - nghe ý kiến khác nhau ...
Hãy thử nsiqcppstyle, trình kiểm tra kiểu C++ được viết bằng python.
Cá nhân tôi đã thử cppcheck (v1.4) và thấy nó vô vọng.
ví dụ: Ví dụ này đã được phát hiện một cách chính xác cho mảng nằm ngoài giới hạn:
int a[4];
for (int n = 0; n < 5; n++)
{
a[n] = n;
}
Nhưng ví dụ này đã không được phát hiện:
int a[4];
int z = 4 + 1;
for (int n = 0; n < z; n++)
{
a[n] = n;
}
Một công cụ cho danh sách: Google cpplint.py, mà dẫn mentions ++ kiểu C của Google. Nó rất cụ thể cho Google, nhưng dù sao đi nữa.
Cần lưu ý rằng cpplint.py của Google chủ yếu kiểm tra các vi phạm kiểu mã _their_ có thể có hoặc không khớp với kiểu bạn đang theo dõi. –
@ Brian Briançon, khiếu nại phong cách của cpplint làm phiền tôi, đặc biệt là khi họ liên quan đến mối quan tâm không liên quan (vị trí của cặp ngoặc nhọn là vấn đề về hương vị, * không * vấn đề chất lượng), nhưng tôi thấy nó vẫn đáng để sử dụng chỉ để kiểm tra đầu trang (không sử dụng/không cần thiết, thiếu, vv). Tôi tiếp tục nghĩ rằng tôi nên ngã ba nó không chỉ tách các mối quan tâm, nhưng làm cho nó cấu hình nhiều hơn (tùy chọn CLI để vô hiệu hóa/sửa đổi kiểm tra phong cách, vv). –
Séc yêu thích của tôi từ cpplint.py của Google là trong danh mục 'runtime/explicit', cụ thể là việc kiểm tra các hàm tạo đối số đơn không được đánh dấu là' tường minh'.Điều này bắt lỗi thực sự trong mã thực, và không cung cấp cho nhiều "sai tích cực." –
Câu hỏi SO này có câu trả lời có liên quan: [Công cụ dòng lệnh tốt nhất để làm sạch mã là gì?] (Http://stackoverflow.com/questions/393208/what-is-the-best-command-line- tool-to-clean-up-code) –
https://github.com/facebookarchive/flint – Jimbo