2009-01-24 34 views
22

tôi nhận được cảnh báo này từ GCC:Làm cho một gcc cảnh báo lỗi?

warning: cannot pass objects of non-POD type 'class Something' through '...'; call will abort at runtime

Nó khá nguy hiểm, đặc biệt là kể từ khi nó gọi một hủy bỏ. Tại sao đây không phải là lỗi? Tôi muốn báo lỗi, nhưng:

  1. Làm cách nào để cảnh báo cụ thể là lỗi?
  2. Cảnh báo nào? Theo http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html, -Wno-invalid-offsetof trông giống như lá cờ để che giấu nó, nhưng nó không
+3

May mắn thay, các phiên bản hiện đại của GCC (ít nhất 4.6.3, nhưng có thể sớm hơn) cho bạn biết cờ cảnh báo nào đã kích hoạt cảnh báo cụ thể. Ví dụ: 'main.cpp: 12: 15: lỗi: chia cho 0 [-Werror = div-by-zero]' –

+0

Và đó chỉ là một tính năng tuyệt vời. – hlovdal

Trả lời

22

Tôi không chắc chắn những gì các cảnh báo chính xác là, nhưng một khi bạn đã tìm thấy nó, bạn có thể thay đổi đó là bố trí với sau (sử dụng 'định dạng' như ví dụ):

#pragma GCC diagnostic error "-Wformat" 

Hoặc như strager chỉ ra:

gcc -Werror=format ... 

Edit: tôi vừa mới kiểm tra các nguồn gcc cho điều này và cảnh báo cụ thể này không thể bị vô hiệu hóa thông qua cờ dòng lệnh.

3

Bạn có thể sử dụng cờ trình biên dịch -Werror để chuyển tất cả hoặc một số cảnh báo thành lỗi.

6

Có vẻ như có một loạt các cảnh báo khác mà bạn không muốn bị biến thành lỗi (sử dụng cờ -Werror). Nói chung, thực hành tốt của nó để sửa tất cả các cảnh báo. Sử dụng -Werror lực lượng này.

+0

Amen, mã của bạn phải được cảnh báo miễn phí với ít nhất -Wall (mặc dù một số nội dung mà báo cáo -Wextra có thể tha thứ, ví dụ: biến không sử dụng/tham số). –

+1

Bạn có thể thực hiện -Wall -Wextra -Wno-unused-parameters -Wno-unused-functions ... Bất kỳ cảnh báo cụ thể nào đều có thể bị vô hiệu hóa bằng cú pháp -Wno- $ foo, điều này giúp dễ dàng giải thích các chi tiết cụ thể. Thật không may, nó không giúp đỡ với bất kỳ tập con của các cảnh báo -pantic. – Tom

+0

Cảnh báo không phải là lỗi được "cố định". Và mã cảnh báo miễn phí là một khái niệm khó nắm bắt, trừ khi bạn sửa phiên bản trình biên dịch. Xem thêm [Tidbits: Vì tình yêu của thần, đừng dùng -Werror!] (Http://blog.schmorp.de/2016-02-27-tidbits-for-the-love-of-god-dont- use-werror.html). – Ruslan

10

-Werror=specific-warning sẽ biến số -Wspecific-warning được chỉ định thành lỗi trong GCC 4.3.x hoặc mới hơn. Trong 4.1.2, chỉ có -Werror-implicit-function-declaration hoạt động. Lưu ý dấu gạch nối thay vì bằng dấu - nó hoạt động cho trường hợp cụ thể đó và không có trường hợp nào khác. Đây là một trong những cảnh báo phổ biến nghiêm trọng hơn và nó chắc chắn tiện dụng để làm cho nó thành một lỗi.

Ngoài ra, các phiên bản cũ của GCC chỉ có vẻ như cung cấp dấu hiệu cảnh báo lỗi cuối cùng của cảnh báo -Werror.

2

Bạn có thể sử dụng tùy chọn -fdiagnostics-show-để xem tùy chọn -W áp dụng cho một cảnh báo cụ thể.

Thật không may, trong trường hợp này không có tùy chọn cụ thể bao gồm cảnh báo đó.

Dường như sẽ có hỗ trợ tốt hơn cho điều này trong gcc-4.5.

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