2016-03-07 17 views
10

thời gian gần đây tôi đã có một lỗi trong một bối cảnh tương tự tiếp theo một:cờ cảnh báo gcc cho các chuyển đổi ngầm

double getSomeValue() 
{ 
    return 4.0; 
} 
... 
std::string str; 
str = getSomeValue(); 

Như bạn có thể thấy ở đây rất dễ dàng để phát hiện vấn đề, nhưng trong một cơ sở mã lớn, nơi getSomeValue() là không phải trong cùng một tệp với mã gọi điện, có thể khó phát hiện việc chuyển đổi im lặng này sang số double sang std::string. GCC biên dịch mã này tốt với -Wall -Wextra -Werror (đầu ra mẫu ở đây, tôi không biết cờ cảnh báo nào đã được sử dụng: http://ideone.com/BTXBFk).

Làm thế nào tôi có thể buộc GCC phát ra cảnh báo cho các chuyển đổi tiềm ẩn nguy hiểm này? Tôi đã thử -Wconversion, nhưng nó rất nghiêm ngặt và nó gây ra lỗi trong hầu hết các tiêu đề được bao gồm cho các trường hợp phổ biến như unsigned - 1. Có phiên bản yếu hơn của -Wconversion không?

+0

Nó thực sự là 'double' →' char' → 'chuyển đổi chuỗi'. Người đầu tiên có thể bị bắt bởi '-Wfloat-conversion' cũng được kích hoạt bởi' -Wconversion' –

+0

@Revolver_Ocelot Cảm ơn bạn, lá cờ này có vẻ là cái tôi đang tìm kiếm. Thật không may nó không có sẵn trong GCC 4.8.2 – Felics

+0

@ DieterLücking Tôi đã chỉ định trong câu hỏi mà tôi không thể sử dụng -Wconversion vì tôi nhận được rất nhiều lỗi cho unsigned - 1 giống như các cấu trúc trong nhiều tiêu đề được bao gồm. – Felics

Trả lời

5

Bạn có thể sử dụng cờ -Wfloat-conversion hoặc lớn hơn -Wconversion.

Tuy nhiên, hãy lưu ý rằng với cú pháp cú pháp khởi tạo đồng nhất C++ 11 đồng nhất, bạn sẽ nhận được cảnh báo "ngoài hộp", không có cờ -Wconversion; ví dụ .:

#include <string> 

double getSomeValue() { 
    return 4.0; 
} 

int main() { 
    std::string str{ getSomeValue() }; // C++11 brace-init 
} 
C:\Temp\CppTests>g++ -std=c++11 test.cpp 
test.cpp: In function 'int main()': 
test.cpp:8:35: warning: narrowing conversion of 'getSomeValue()' from 'double' t 
o 'char' inside { } [-Wnarrowing] 
    std::string str{ getSomeValue() }; 
           ^
+0

Điều này không giúp ích gì với 'str = getSomeValue();', đó là nhiệm vụ thay vì khởi tạo (Có lẽ có những trường hợp trong mã OP nơi mà việc chuyển nhượng đến một lúc sau khi biến đã được sử dụng, vì vậy nó không thể được thay thế bằng khởi tạo) –

+0

@MM: Có lẽ trong những trường hợp như thế này có thể làm việc cho OP: 'str = std :: string {getSomeValue()};'. Dù sao, tôi xem xét việc sử dụng '-Wconversion' một lựa chọn tốt. –

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