ASSERT_EQUALS("[test.cpp:2]: (error) Shifting 32-bit value by 32 bits is undefined behaviour\n", errout.str());
check("int foo(int x) {\n"
" return x << 2;\n"
"}",&settings);
ASSERT_EQUALS("", errout.str());
check("int foo(int x) {\n"
" return (long long)x << 40;\n"
"}",&settings);
ASSERT_EQUALS("", errout.str());
check("void foo() {\n"
" QList<int> someList;\n"
" someList << 300;\n"
"}", &settings);
ASSERT_EQUALS("", errout.str());
}
voidcheckIntegerOverflow() {
Settings settings;
settings.platform(Settings::Unix32);
check("int foo(int x) {\n"
" if (x==123456) {}\n"
" return x * x;\n"
"}",&settings);
ASSERT_EQUALS("[test.cpp:3]: (warning) Signed integer overflow for expression 'x*x'. See condition at line 2.\n", errout.str());
check("int foo(int x) {\n"
" if (x==123456) {}\n"
" return -123456 * x;\n"
"}",&settings);
ASSERT_EQUALS("[test.cpp:3]: (warning) Signed integer overflow for expression '-123456*x'. See condition at line 2.\n", errout.str());
check("int foo(int x) {\n"
" if (x==123456) {}\n"
" return 123456U * x;\n"
"}",&settings);
ASSERT_EQUALS("", errout.str());
}
voidsignConversion() {
check("unsigned int f1(signed int x, unsigned int y) {"// x is signed
" return x * y;\n"
"}\n"
"void f2() { f1(-4,4); }");
ASSERT_EQUALS("[test.cpp:1]: (warning) Suspicious code: sign conversion of x in calculation, even though x can have a negative value\n", errout.str());
check("unsigned int f1(int x) {"// x has no signedness, but it can have the value -1 so assume it's signed
" return x * 5U;\n"
"}\n"
"void f2() { f1(-4); }");
ASSERT_EQUALS("[test.cpp:1]: (warning) Suspicious code: sign conversion of x in calculation, even though x can have a negative value\n", errout.str());
check("unsigned int f1(int x) {"// #6168: FP for inner calculation
" return 5U * (1234 - x);\n"// <- signed subtraction, x is not sign converted