2008-11-21 22 views
9

Sau đây là một số mã rõ ràng bị lỗi mà tôi cho rằng trình biên dịch sẽ phát ra một chẩn đoán. Nhưng không phải gcc cũng không g++ không, ngay cả với tất cả các tùy chọn cảnh báo tôi có thể nghĩ ra: -pedantic -Wall -WextraTôi có thể khiến GCC cảnh báo về việc truyền các loại quá rộng đến các chức năng không?

#include <stdio.h> 

short f(short x) 
{ 
    return x; 
} 

int main() 
{ 
    long x = 0x10000007; /* bigger than short */ 
    printf("%d\n", f(x)); /* hoping for a warning here */ 
    return 0; 
} 

Có cách nào để làm cho gccg++ cảnh báo về điều này? Trên một mặt lưu ý, bạn có một trình biên dịch khác cảnh báo về điều này theo mặc định hoặc trong một cấu hình cảnh báo phụ khá phổ biến?

Lưu ý: Tôi đang sử dụng GCC (cả trình biên dịch C và C++) phiên bản 4.2.4.

Chỉnh sửa: Tôi chỉ thấy rằng gcc -Wconversion hiện các trick, nhưng cùng một lựa chọn để g++ không, và tôi thực sự sử dụng C++ ở đây, vì vậy tôi cần một giải pháp cho g++ (và bây giờ đang tự hỏi tại sao -Wconversion doesn' t có vẻ là nó).

Chỉnh sửa: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=34389 gợi ý rằng điều này có thể được sửa trong g++ 4.4 ... có thể? Nó không rõ ràng với tôi được nêu ra nếu nó là cùng một vấn đề và/hoặc nếu sửa chữa thực sự đến trong phiên bản đó. Có thể ai đó có 4.3 hoặc 4.4 có thể thử trường hợp thử nghiệm của tôi.

Trả lời

6

Sử dụng -Wconversion - vấn đề là một diễn viên tiềm ẩn (chuyển đổi) từ dài x đến ngắn khi hàm f (short x) được gọi là [not printf], và -Wconversion sẽ nói một cái gì đó như "cast từ dài đến ngắn có thể thay đổi giá trị".

..

Chỉnh sửa: vừa xem ghi chú của bạn. -Kết quả chuyển đổi trong một cảnh báo cho tôi, sử dụng g ++ 4.3.2 trên Linux ... (4.3.2-1 trên Debian)

+0

Aha - vì vậy nó chỉ là 4.2.4 quá "cũ" để làm cho nó cảnh báo và tôi có thể thấy 4.3.2 công trình (tôi đang đưa ra một vài giả định ở đây, nhưng tôi nghĩ nó an toàn để nói bởi vì tôi đang sử dụng Ubuntu và tôi thấy một số lưu ý về vấn đề này chỉ cần một cái gì đó cố định trong 4.3 + –

+0

Bây giờ tôi đã thử với GCC 4.3.2 trên một máy Ubuntu Intrepid, và -Wconversion làm những gì tôi muốn.Hoàn thành.Nhưng boo cho 4.2.4 không làm việc .. –

+0

thiếu một đề cập đến -Wign -conversion cho g ++ (cần thiết ít nhất là trong các phiên bản mới hơn) ... – codeling

0

Tôi thực sự khuyên bạn nên đầu tư vào PC-lint/FlexeLint từ Gimpel. Các phần mềm được thực hiện để bắt những thứ như thế này mà trình biên dịch chỉ là không. Nó là tương đối rẻ tiền và cũng đáng giá. Có một bản demo trực tuyến trên trang web mà bạn có thể sử dụng để đánh giá nó, đây là những gì nó báo cáo cho các dòng trong câu hỏi từ ví dụ của bạn:

diy.cpp 14 Info 734: Loss of precision (arg. no. 1) (31 bits to 15 bits) 
Các vấn đề liên quan