You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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());
// Ticket #6793
check("template<int I> int foo(int x) { return x << I; }\n"
"const int f = foo<31>(1);\n"
"const int g = foo<100>(1);\n"
"template<int I> int hoo(int x) { return x << 32; }\n"
"const int h = hoo<100>(1);", &settings);
ASSERT_EQUALS("[test.cpp:4]: (error) Shifting 32-bit value by 32 bits is undefined behaviour\n"
"[test.cpp:1]: (error) Shifting 32-bit value by 100 bits is undefined behaviour\n", errout.str());
// #7266: C++, shift in macro
check("void f(int x) {\n"
" UINFO(x << 1234);\n"
"}");
ASSERT_EQUALS("", errout.str());
}
voidcheckIntegerOverflow() {
Settings settings;
settings.platform(Settings::Unix32);
settings.addEnabled("warning");
check("int foo(signed int x) {\n"
" if (x==123456) {}\n"
" return x * x;\n"
"}",&settings);
ASSERT_EQUALS("[test.cpp:3]: (warning) Either the condition 'x==123456' is redundant or there is signed integer overflow for expression 'x*x'.\n", errout.str());
check("int foo(signed int x) {\n"
" if (x==123456) {}\n"
" return -123456 * x;\n"
"}",&settings);
ASSERT_EQUALS("[test.cpp:3]: (warning) Either the condition 'x==123456' is redundant or there is signed integer overflow for expression '-123456*x'.\n", errout.str());
check("int foo(signed 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
"}\n"
"void f2() { f1(-4); }");
ASSERT_EQUALS("", errout.str());
// Dont warn for + and -
check("void f1(int x) {"
" a = x + 5U;\n"
"}\n"
"void f2() { f1(-4); }");
ASSERT_EQUALS("", errout.str());
check("size_t foo(size_t x) {\n"
" return -2 * x;\n"
"}");
ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious code: sign conversion of -2 in calculation because '-2' has a negative value\n", errout.str());
}
voidlongCastAssign() {
Settings settings;
settings.addEnabled("style");
settings.platform(Settings::Unix64);
check("long f(int x, int y) {\n"
" const long ret = x * y;\n"
" return ret;\n"
"}\n", &settings);
ASSERT_EQUALS("[test.cpp:2]: (style) int result is assigned to long variable. If the variable is long to avoid loss of information, then you have loss of information.\n", errout.str());
// typedef
check("long f(int x, int y) {\n"
" const size_t ret = x * y;\n"
" return ret;\n"
"}\n", &settings);
ASSERT_EQUALS("", errout.str());
// astIsIntResult
check("long f(int x, int y) {\n"
" const long ret = (long)x * y;\n"
" return ret;\n"
"}\n", &settings);
ASSERT_EQUALS("", errout.str());
}
voidlongCastReturn() {
Settings settings;
settings.addEnabled("style");
check("long f(int x, int y) {\n"
" return x * y;\n"
"}\n", &settings);
ASSERT_EQUALS("[test.cpp:2]: (style) int result is returned as long value. If the return value is long to avoid loss of information, then you have loss of information.\n", errout.str());