Đánh giá độc lập về PVS-Studio (Linux, C++)

Tôi thấy một ấn phẩm mà PVS đã học cách phân tích trên Linux và quyết định thử nó trên các dự án của riêng tôi. Và đây là kết quả của nó.


nội dung

  1. Ưu điểm
  2. Nhược điểm
  3. Kết quả
  4. bạt

Ưu điểm

Hỗ trợ đáp ứng

Tôi đã yêu cầu một khóa dùng thử và họ đã gửi nó cho tôi ngay trong ngày.

Giấy tờ khá rõ ràng

Chúng tôi đã khởi động được máy phân tích mà không gặp bất kỳ vấn đề gì. Trợ giúp cho các lệnh console cũng có sẵn (mặc dù có một số phàn nàn ở đây, hãy xem phần Nhược điểm).

Khả năng phân tích đa luồng

Máy phân tích có tùy chọn "tiêu chuẩn" -j, cho phép phân tích được thực hiện song song trong một số nhiệm vụ. Điều này tiết kiệm rất nhiều thời gian.

Trực quan tốt

Nhiều định dạng đầu ra khác nhau, từ văn bản đến một trang web nhỏ. Giao diện web tiện lợi, ngắn gọn, có gợi ý bên cạnh các dòng trong mã và liên kết đến mô tả chẩn đoán.

Dễ dàng tích hợp vào lắp ráp

Tất cả tài liệu đều có trên trang web của họ, tôi chỉ có thể nói rằng nếu dự án của bạn được xây dựng bằng CMake thì mọi thứ đều rất đơn giản.

Mô tả chẩn đoán tốt

Nếu bạn tạo đầu ra ở chế độ fullhtml, thì mỗi thông báo có một liên kết đến mô tả chẩn đoán, kèm theo giải thích, ví dụ về mã và các liên kết bổ sung.

Nhược điểm

Máy phân tích không biết ngôn ngữ C++

Thật không may, PVS đôi khi mắc lỗi cú pháp và tạo ra các thông báo sai khi mã hoàn toàn chính xác.

Ví dụ: có một hàm trả về void:

template <typename T>
auto copy (const void * source, void * destination)
    ->
        std::enable_if_t
        <
            std::is_copy_constructible<T>::value
        >
{
    new (destination) T(*static_cast<const T *>(source));
}

Có, từ khóa auto Có thể có nghĩa là void, đó là mục đích của nó tự động. Nhưng PVS đã đưa ra các thông báo sau:

dynamic_tuple_management.hpp:29:1: error: V591 Non-void function should return a value.
dynamic_tuple_management.hpp:29:1: error: V2542 Function with a non-void return type should return a value from all exit paths.

Trang web rất chậm

Có, trong giao diện web bên cạnh mỗi thông báo có một liên kết đến mô tả chẩn đoán tương ứng kèm theo các ví dụ. Nhưng khi click vào link nào đó thì bạn phải đợi khá lâu, có khi xảy ra trường hợp 504 Cổng Time-out.

Ngôn ngư

Tất cả các mô tả đều bằng tiếng Nga, điều này thật tuyệt. Nhưng các liên kết từ báo cáo luôn dẫn đến phiên bản tiếng Anh. Sẽ thật tuyệt nếu có thể chuyển đổi ngôn ngữ để bạn có thể xem chẩn đoán ngay lập tức bằng tiếng Nga. Tôi không tìm thấy tùy chọn như vậy trong giao diện.

Thật bất tiện khi làm việc với các mức chẩn đoán thông qua bảng điều khiển

Hãy bắt đầu với thực tế là hai lệnh được sử dụng (lệnh này pvs-studio-analyzer и plog-converter) các định dạng khác nhau để chỉ định chẩn đoán.

Giúp cho pvs-studio-analyzer đọc:

-a [MODE], --analysis-mode [MODE]
    MODE defines the type of warnings:
    1 - 64-bit errors;
    2 - reserved;
    4 - General Analysis;
    8 - Micro-optimizations;
    16 - Customers Specific Requests;
    32 - MISRA.
    Modes can be combined by adding the values
    Default: 4

Tôi đã mất một thời gian dài cố gắng tìm ra nơi để đi thêm các phím (“thêm các giá trị”). Tôi đã cố gắng liệt kê chúng cách nhau bằng dấu phẩy:

pvs-studio-analyzer analyze ... -a 1,4,16

Tôi đã cố gắng đăng ký key nhiều lần:

pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16

Và chỉ sau đó tôi mới nhận ra rằng đây là những chiếc mặt nạ bit! Và bạn cần Tổng hợp, А не thêm ý nghĩa. Ví dụ: để có được chẩn đoán chung, chẩn đoán tối ưu hóa vi mô và MISRA, bạn cần tổng hợp chúng (4 + 8 + 32 = 44):

pvs-studio-analyzer analyze ... -a 44

Sử dụng mặt nạ bit trong giao diện người dùng nói chung là hình thức xấu. Tất cả điều này có thể được tóm tắt nội bộ và một bộ cờ có thể được đặt cho người dùng.

Ngoài ra còn có tiện ích plog-converter, tạo ra thông tin phân tích tĩnh mà con người có thể đọc được. Cô ấy có những vấn đề khác.

Trợ giúp cho chương trình plog-converter báo cáo:

-a, --analyzer            Specifies analyzer(s) and level(s) to be
                          used for filtering, i.e.
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Default: GA:1,2

Một số “cấp độ” xuất hiện ở đây mà trước đây chưa từng có và tôi cũng không tìm thấy bất cứ điều gì về chúng trong tài liệu.

Nói chung là không rõ ràng. Đó là lý do tại sao tôi đặt mọi thứ ở mức tối đa.

Một lũ chửi thề ngu ngốc trên Catch

Hai trong số ba dự án tôi phân tích sử dụng thư viện thử nghiệm đơn vị Bắt2. Và tỷ lệ tin nhắn của sư tử (!!! 90 trên 138 ở một và 297 trên 344 ở nơi kia!!!) có dạng sau:

Đánh giá độc lập về PVS-Studio (Linux, C++)

Không tính đến đa luồng

Có nhiều kết quả dương tính giả về các biến được cho là không thay đổi hoặc các vòng lặp vô tận, trong khi hoạt động với các biến này diễn ra từ các luồng khác nhau và nếu điều này không xảy ra thì các bài kiểm tra đơn vị sẽ không hoạt động.

Đánh giá độc lập về PVS-Studio (Linux, C++)

Tuy nhiên, liệu một máy phân tích tĩnh có thể tính đến điều này không? Không biết.

Kết quả

PVS không tìm thấy bất kỳ lỗi thực sự nào trong các dự án nguồn mở của tôi Burst и Kế tiếp, cũng như trong một bản thảo đang làm việc, mà vì những lý do hiển nhiên nên tôi không thể trình bày. Đúng, điều đáng lưu ý là một số thiếu sót đã được phát hiện và sửa chữa trước đó bằng cách sử dụng cppcheck и scan-build.

Nhìn chung, ấn tượng từ tất cả các máy phân tích này là gần như nhau: vâng, chúng nắm bắt được thứ gì đó, đôi khi thậm chí là thứ gì đó quan trọng, nhưng nhìn chung trình biên dịch là đủ.

Có thể (và cá nhân tôi thích nghĩ như vậy) nhóm của chúng tôi sử dụng các phương pháp phát triển phần mềm cho phép chúng tôi tạo ra số lượng mã tồi tệ tối thiểu. Thà không tạo ra vấn đề còn hơn là anh dũng vượt qua chúng.

Vì vậy, tôi xin mạn phép đưa ra một số lời khuyên về cách viết bằng C++ sao cho không bắn đứt chân hoặc dùng cào đập vào trán ai.

Tận dụng tối đa chẩn đoán trình biên dịch

Nhóm của chúng tôi sử dụng (và khuyên bạn nên) các tùy chọn biên dịch sau:

-Werror

-Wall
-Wextra
-Wpedantic

-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo

Kích hoạt chúng trong dự án của bạn và tìm hiểu nhiều điều về mã của bạn.

Bám sát tiêu chuẩn

Cố gắng không sử dụng những thứ phụ thuộc vào nền tảng nếu có các chất tương tự tiêu chuẩn và nếu bạn hoàn toàn không thể làm gì nếu không có chúng, hãy bọc chúng trong các khối đặc biệt cho macro (hoặc thứ gì khác) và chỉ cần không để mã của bạn được biên dịch trong các điều kiện không được hỗ trợ.

Bám sát ngữ nghĩa hoạt động tiêu chuẩn

Phép cộng phải là phép cộng, phép nhân phải là phép nhân, lệnh gọi hàm phải là lệnh gọi hàm, bản sao phải là bản sao, vùng chứa phải là phép lặp, trình vòng lặp phải có khuyến mãi ++ và hội thảo *. Vân vân và vân vân.

Tôi nghĩ ý tưởng này đã rõ ràng. Có những quy ước đã được thiết lập không mang tính ràng buộc nhưng mà tất cả người dùng và người đọc mã của bạn đều mong đợi được thấy. Đừng cố gắng đánh lừa người khác, nếu không bạn sẽ đánh lừa chính mình.

Viết mã tương thích

Trước hết, ý tôi là thư viện tiêu chuẩn. Điều rất mong muốn là giao diện của các lớp và hàm của bạn có thể được sử dụng với các thư viện tiêu chuẩn và thư viện khác (ví dụ: Boost).

Vui lòng xem qua giao diện STL và Boost. Với những trường hợp ngoại lệ hiếm hoi, bạn sẽ thấy ở đó một hình mẫu xứng đáng.

Tận dụng tối đa các công cụ nguồn mở

Đối với cùng một phân tích tĩnh, có ít nhất hai công cụ mở miễn phí có thể được kết nối chỉ một lần với bất kỳ dự án nào bằng hệ thống xây dựng CMake.

Bạn có thể đọc thêm về điều này trong ấn phẩm gần đây của tôi.

bạt

Cuối cùng, tôi muốn nhấn mạnh rằng tôi không ủng hộ việc không sử dụng PVS hoặc bất kỳ máy phân tích tĩnh nào khác. Nhưng tôi khuyến khích bạn nghĩ về việc máy phân tích tĩnh liên tục tìm thấy những lỗi nghiêm trọng trong mã của bạn đã xảy ra như thế nào.

Đây chỉ là một hệ quả. Chúng ta cần tìm kiếm và loại bỏ nguyên nhân.

Nguồn: www.habr.com

Thêm một lời nhận xét