I recently had a bug in a similar context to next one:
double getSomeValue()
{
return 4.0;
}
...
std::string str;
str = getSomeValue();
As you can see here is easy to spot the problem, but in a large code base where getSomeValue()
is not in the same file with the calling code it might be difficult to spot this double
to std::string
silent conversion. GCC compiles this code fine with -Wall -Wextra -Werror
(sample output here, I don't know what warning flags were used: http://ideone.com/BTXBFk).
How may I force GCC to emit warnings for these dangerous implicit conversions? I tried -Wconversion
, but it is very strict and it causes errors in most included headers for common cases like unsigned - 1
. Is there a weaker version of -Wconversion
?
-Werror is a compiler flag that causes all compiler warnings to be treated as errors. Developers who enable -Werror are making a statement: we care about our code base, and we won't accept warnings here.
gcc -Wall enables all compiler's warning messages. This option should always be used, in order to generate better code.
You can use the -Werror compiler flag to turn all or some warnings into errors. Show activity on this post. You can use -fdiagnostics-show-option to see the -W option that applies to a particular warning.
GCC 4.3+ now has -Q --help=warnings , and you can even specify --help=warnings,C to just print out the C related warnings.
When there is the potential for this confusion, GCC issues a warning when this flag is specified. To eliminate the warning, add explicit braces around the innermost if statement so there is no way the else can belong to the enclosing if. The resulting code looks like this: This warning is enabled by -Wparentheses .
When there is the potential for this confusion, GCC issues a warning when this flag is specified. To eliminate the warning, add explicit braces around the innermost if statement so there is no way the else can belong to the enclosing if. The resulting code looks like this:
To help detect accidental misuses of such arrays GCC issues warnings unless it can prove that the use is safe. See Common Variable Attributes . Warn for cases where adding an attribute may be beneficial.
If the value of y is always 1, 2 or 3, then x is always initialized, but GCC doesn’t know this. To suppress the warning, you need to provide a default case with assert(0) or similar code. This option also warns when a non-volatile automatic variable might be changed by a call to longjmp. The compiler sees only the calls to setjmp.
You can use the -Wfloat-conversion
flag, or the broader -Wconversion
.
However, note that with C++11 uniform initialization brace syntax, you get a warning "out of the box", without the -Wconversion
flag; e.g.:
#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() }; ^
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With