2012-11-11 47 views
8

Có thể yêu cầu GCC sử dụng cờ warn_unused_result cho tất cả chức năng ngay cả khi không có thuộc tính tương ứng không? Bởi vì nếu tôi có thể quên kiểm tra giá trị trả về, tôi cũng có thể quên thêm thuộc tính cụ thể GCC.Làm cho warn_unused_result được áp dụng cho tất cả các chức năng với GCC

Tôi đã thấy nó có thể thực hiện được với một số trình biên dịch khác.

+0

Từ việc xem xét các tài liệu tôi sẽ nói câu trả lời là không. –

+0

thay thế: bạn có thể chạy các chương trình của bạn thông qua nẹp, thử nghiệm cho các giá trị trả lại bị bỏ qua: http://www.splint.org – justin

+0

Trình biên dịch nào hỗ trợ nó? – sinelaw

Trả lời

1

Không, bạn chỉ có thể yêu cầu gcc bỏ qua tất cả các cờ warn_unused_result với -Wno-unused-result nhưng chỉ -Wunused-result tương ứng chỉ đặt mặc định (chỉ cảnh báo trên cờ). Biên dịch với -Wall -Wextra -pedantic nên đã kích hoạt một cảnh báo nếu nó có thể được kích hoạt nhưng nó không, vì vậy nó không thể. Ngoài ra, tôi tự hỏi tại sao bạn muốn điều này, nó không phải là không phổ biến để bỏ qua kết quả của các chức năng, và tất cả các thư viện có khả năng để sản xuất tấn cảnh báo. Các tính năng chính của nó là không phổ biến.

+2

Chúng tôi đang viết thư viện riêng của mình và chúng tôi muốn loại trừ càng nhiều lỗi càng tốt. Một vài ngày trước, tôi đã nhận thấy rằng một trong những lập trình viên của chúng tôi đã không kiểm tra kết quả của __fread__. Thật vậy, trường hợp như vậy là khá hiếm, nhưng nếu nó xảy ra do tài nguyên thấp trên máy nhúng, lib của chúng tôi phải xử lý nó mà không bị lỗi ứng dụng chính. Vì vậy, chúng tôi muốn theo dõi nhiều lần kiểm tra nhất có thể. – PoltoS

+0

@PoltoS: Nếu bạn đang sử dụng C++ có thể là một cách để bọc các loại trả về, nhưng điều đó sẽ làm việc nhiều hơn hoặc ít hơn như 'warn_unused_result'. – bitmask

+0

Chúng tôi đang sử dụng C ... Lạ là GCC không cung cấp một lá cờ như vậy. Có thể là nó có thể hack nó một chút để "hầu như" thêm một lá cờ như vậy cho mỗi chức năng? – PoltoS

0

Mặc dù có vẻ như không thể thực hiện được với GCC, nhưng bạn có thể chạy các máy phân tích tĩnh như độ che phủ và lint để nắm bắt chúng.

+0

Câu trả lời hay sau gần 5 năm;) bìa là SAAS. Tôi không thể tải mã của công ty lên một số máy chủ của bên thứ ba. Ngoài ra phần ba máy chủ không biết gì về môi trường và hệ thống của tôi bao gồm các tập tin. Tôi đã không tìm thấy phân tích tĩnh tốt cho đến nay mà không phàn nàn về loại nền tảng cụ thể. – PoltoS

+0

Tôi không chắc chắn nếu bìa là một SaaS chỉ cung cấp. Chủ nhân của tôi sử dụng trang bìa và tôi tin rằng không có mã nào rời khỏi máy chủ của tổ chức. https://community.synopsys.com/s/question/0D53400003RpaYWCAZ/can-coverity-connect-be-installed-in-an-isolated-environment – Soorajchirag

0

Có một plugin clang, trong số elfs-clang-plugins (do chính tôi viết, nguồn mở) giúp ích.

Mặc dù không dành cho GCC, nhưng vẫn có thể hữu ích, ví dụ: nếu bạn có thể thêm nó vào quá trình CI gatekeeping của bạn (nếu bạn có một) hoặc chỉ cần chạy nó một cách thủ công một lần trong một thời gian.

Plugin warn_unused_result sẽ phát ra cảnh báo cho các hàm thiếu thuộc tính warn_unused_result. Plugin chỉ xem xét các hàm được khai báo hoặc được định nghĩa trong đơn vị biên dịch hiện tại, do đó các thư viện bên ngoài không thêm tiếng ồn.

Plugin chấp nhận tùy chọn arg, --static-only khiến nó chỉ cảnh báo về các hàm tĩnh (vì khi thay đổi API bên ngoài quá nhiều công việc).

Ví dụ:

int foo(void); 

biên dịch ra:

/tmp/test.c:1:5: warning: missing attribute warn_unused_result 
int foo(void); 
Các vấn đề liên quan