7

Tôi đang sử dụng trình biên dịch Wind River 4 (gcc (C) và g ++ (C++)) và nó biên dịch tất cả các dự án của tôi mà không gặp bất kỳ sự cố nào. Bây giờ tôi phải sử dụng Coverity Static Analysis để kiểm tra mã của tôi. Tôi đã cấu hình các trình biên dịch cụ thể. Đối với C-Mã (gcc) không có vấn đề và tôi có thể chạy các phân tích, nhưng đối với C++ - Mã số (g ++) Tôi có rất nhiều lỗi:Làm cách nào để có được phân tích tĩnh Coverity tương thích với chuẩn C++ 0x?

.../c++config.h", line 214: error #40: 
    expected an identifier 
inline namespace __gnu_cxx_ldbl128 { } 
    ^

.../c++config.h", line 214: error #326: 
    inline specifier allowed on function declarations only 
inline namespace __gnu_cxx_ldbl128 { } 
^ 

.../c++config.h", line 214: error #65: 
    expected a ";" 
inline namespace __gnu_cxx_ldbl128 { } 
           ^
.../include/string.h", line 76: error #312: 
    cannot overload functions distinguished by return type alone 
extern __const void *memchr (__const void *__s, int __c, size_t __n) 
        ^

.../include/string.h", line 116: error #312: 
    cannot overload functions distinguished by return type alone 
extern "C++" __const void *memchr (__const void *__s, int __c, size_t __n) 
        ^

Nó dường như là một số C++ 11 tính năng cụ thể như không gian tên nội tuyến nhưng mã không sử dụng các tính năng này. Các lỗi trên được sản xuất với một HelloWorld-Code:

#include "stdio.h" 
#include "util.h" 
#include <string> 
#include "string.h" 

using namespace std; 

int main() 
{ 
    printf("Hello World, C++ version: %d.%d.%d\r\n",__GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__); 

    return 0; 
} 

Tôi đã cố gắng để thiết lập các tiêu chuẩn C++ với các tùy chọn g ++

-std=c++98 

nhưng kết quả không thay đổi.

Các Test-Mã là một xây dựng hệ thống phân cấp lớn nhưng các bước cho Coverity là như thế này:

  1. mục tiêu và env bộ (Wind River 4 Linux)
  2. làm sạch
  3. cov-configure với trình biên dịch dir và loại
  4. cov-xây dựng với đúng "làm tất cả" lệnh mà làm việc một mình
  5. cov-phân tích
  6. if (no_error) cov-comm it-khuyết tật

Tôi cũng đã cấu hình Coverity để thay thế tất cả "không gian tên nội tuyến" với "không gian tên" trong cov-build (--ppp-translator replace/inline namespace/namespace). Các lỗi nội tuyến biến mất nhưng nó tạo ra nhiều lỗi quá tải này và không xây dựng thành công. Cũng cố gắng để loại bỏ "C + +" theo cùng một cách nhưng không làm việc luôn có nhiều lỗi hơn.

Có ai có ý tưởng về vấn đề ở đây không? Và làm thế nào tôi có thể có được Coverity xây dựng mà không có lỗi? Có lẽ tôi có thể cấu hình Coverity để bỏ qua tiêu đề tiêu chuẩn C++ nhưng bây giờ tôi không làm thế nào?

+0

Bạn đang sử dụng phiên bản gcc nào? 4 không đủ cụ thể. Dù sao, bạn nên mở một trường hợp với [email protected] - gửi cho họ nhật ký xây dựng và nguồn tiền xử lý của bạn và họ sẽ có thể cho bạn biết bạn cần thêm gì vào cấu hình của mình để cho phép cov-emit xử lý thành công nó. –

+0

WindRiver Env. là WR-Linux-4.0/Toolchain-4.4-291 và gcc được sử dụng có vẻ là phiên bản 4.4.1. Đó là phiên bản của thư mục bao gồm gcc trong quá trình tạo tập lệnh. Tôi bây giờ cũng liên lạc với sự hỗ trợ: Vấn đề là đặc biệt là trình biên dịch WindRiver không được hỗ trợ trong Linux, nhưng hầu như * bất kỳ trình biên dịch * gcc nào. Bây giờ họ đã có nguồn tiền xử lý và kiểm tra nó. Ngoài ra hỗ trợ WindRiver bây giờ là tham gia. – Indimental

+0

Đã trả lời từ Coverity Support và chúng tôi hiện đang cố gắng giải quyết sự cố. – Indimental

Trả lời

4

Cách giải quyết bằng cách hỗ trợ Coverity:

Các namespace inline là một lỗi được biết đến trong Coverity. Để bỏ qua nó, cấu hình Coverity với các tùy chọn bổ sung sau đây (trong file config):

<begin_command_line_config></begin_command_line_config> 
    <add-arg>--ppp_translator</add_arg> 
    <add_arg>replace/inline namespace ([_a-zA-Z0-9]*)\s+\{\s*\}/namespace $1 { } using namespace $1;</add_arg> 
</options> 

Sau đó chúng tôi đã nhận một số lỗi khác, nhưng họ dường như thuộc về tất cả các định nghĩa chuỗi. Bây giờ thêm một Coverity xác định vào đầu Coverity-biên dịch-compat.h (cũng trong thư mục config):

#define __COVERITY_NO_STRING_NODEFS__ 

Sau những thay đổi này cov-build chạy mà không có lỗi và phân tích có thể được bắt đầu.

0

Lỗi này nói nó khá rõ ràng:

inline specifier phép trên tờ khai chức năng chỉ

Có một lý do không gian tên là inline? Mặc dù tôi không có sẵn đặc điểm kỹ thuật, vì vậy tôi không thể cho bạn biết liệu nó có được phép hay không. (Đó là trình biên dịch cho phép nó có thể là một lỗi trong GCC.)

Cố gắng loại bỏ rằng inline và Coverity sẽ hy vọng bằng hạnh phúc.

Có vẻ như Coverity chưa được cập nhật với một số tính năng C++ 11, như các không gian tên nội tuyến.

+0

Đó là vấn đề tôi chưa bao giờ sử dụng "nội tuyến" này và không biết tại sao nó lại ở đó. Tôi quên viết rằng tôi cũng đã cấu hình Coverity để thay thế tất cả "namespace nội tuyến" bằng "namespace" nhưng sau đó xuất hiện nhiều vấn đề hơn như cả hai. – Indimental

+0

không gian tên nội tuyến là một tính năng C++ 11. Đó là chủ yếu cho phiên bản thực hiện thư viện. – bames53

+0

@Thật bạn không thể thay thế các không gian tên nội tuyến bằng các không gian tên, chúng cũng không làm điều tương tự, do đó việc triển khai thư viện sẽ không hoạt động và Coverity sẽ không có hy vọng phân tích chính xác. – bames53

5

Triển khai thư viện của bạn đang sử dụng C++ 11. Có lẽ có #ifdefs loại bỏ tất cả các công cụ C++ 11 khi bạn gọi g ++ với -std=c++98 nhưng có vẻ như tuy nhiên Coverity được tích hợp với g ++, nó không xác định những thứ tương tự cần thiết để tránh các tính năng C++ 11.

Bạn nên tìm hiểu xem các macro mà gcc sử dụng xung quanh mã C++ 11 đó và sau đó đảm bảo rằng Coverity xác định chúng một cách thích hợp khi phân tích dự án của bạn.

+0

Dường như có một vài định nghĩa được phân loại ở đây: http://stackoverflow.com/questions/2958398/gnu-c-how-to-check-when-std-c0x-is-in-effect nhưng tôi không thể tìm bất kỳ kết nối nào với các dòng lỗi. Các dòng lỗi phải làm với mô hình 128 bit dài gấp đôi và không phụ thuộc vào một trong các C++ 0x định nghĩa. Tôi cũng phải nói rằng tôi hoàn toàn mới với những thứ biên dịch sâu sắc như vậy. – Indimental

+0

Thông báo lỗi từ Coverity có thay đổi khi bạn thực hiện Coverity sử dụng C++ 0x đó không? Có thể có các định nghĩa khác mà bạn cần. Bạn có thể làm cho gcc liệt kê mọi thứ nó định nghĩa và sau đó sử dụng nó làm cơ sở cho những gì bạn cần để xác định cho Coverity, hoặc bạn có thể kiểm tra các tệp tiêu đề để xem những gì họ kiểm tra. – bames53

+0

Khi tôi sử dụng tiêu chuẩn C++ 0x, 3 lỗi đầu tiên giống nhau. Cuối cùng cả hai được thay thế bởi các lỗi trong "stringfwd.h": identifier "char32_t" là undefined: template <> struct char_traits ; tương tự cho từ định danh "char16_t". Nó có thể là bao gồm xây dựng bao gồm một số tiêu đề mặc định và rằng họ không tương thích với bản địa bao gồm? Vì vậy, có một cái gì đó ghi đè và chrashes cấu hình tiêu đề. – Indimental

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