Take simplifyIfNotNull and simplifyIfNot out of simplifyTokenList1 (first step for #6072)
This commit is contained in:
parent
1f97e3001b
commit
21cb0cfd60
|
@ -3528,10 +3528,6 @@ bool Tokenizer::simplifyTokenList1(const char FileName[])
|
|||
// simplify bit fields..
|
||||
simplifyBitfields();
|
||||
|
||||
// Simplify '(p == 0)' to '(!p)'
|
||||
simplifyIfNot();
|
||||
simplifyIfNotNull();
|
||||
|
||||
// The simplifyTemplates have inner loops
|
||||
if (_settings->terminated())
|
||||
return false;
|
||||
|
@ -6119,15 +6115,15 @@ void Tokenizer::simplifyIfNotNull()
|
|||
for (Token *tok = list.front(); tok; tok = tok->next()) {
|
||||
Token *deleteFrom = nullptr;
|
||||
|
||||
// Remove 'x = (x != 0)'
|
||||
if (Token::simpleMatch(tok, "= (")) {
|
||||
// Remove 'x = x != 0;'
|
||||
if (Token::simpleMatch(tok, "=")) {
|
||||
if (Token::Match(tok->tokAt(-2), "[;{}] %name%")) {
|
||||
const std::string& varname(tok->previous()->str());
|
||||
|
||||
if (Token::simpleMatch(tok->tokAt(2), (varname + " != 0 ) ;").c_str()) ||
|
||||
Token::simpleMatch(tok->tokAt(2), ("0 != " + varname + " ) ;").c_str())) {
|
||||
if (Token::simpleMatch(tok->next(), (varname + " != 0 ;").c_str()) ||
|
||||
Token::simpleMatch(tok->next(), ("0 != " + varname + " ;").c_str())) {
|
||||
tok = tok->tokAt(-2);
|
||||
tok->deleteNext(8);
|
||||
tok->deleteNext(6);
|
||||
}
|
||||
}
|
||||
continue;
|
||||
|
|
|
@ -1927,7 +1927,7 @@ private:
|
|||
" }\n"
|
||||
" a[i - 1] = 0;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", true, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f() {\n"
|
||||
|
|
|
@ -3889,7 +3889,7 @@ private:
|
|||
" if( m_d != 0 )\n"
|
||||
" return m_iRealVal / m_d;\n"
|
||||
" return dRet;\n"
|
||||
"};\n"
|
||||
"};", nullptr, true, false
|
||||
);
|
||||
ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'A::dGetValue' can be const.\n", errout.str());
|
||||
}
|
||||
|
|
|
@ -793,7 +793,7 @@ private:
|
|||
void incorrectLogicOperator4() {
|
||||
check("void f(int x) {\n"
|
||||
" if (x && x != $0) {}\n"
|
||||
"}");
|
||||
"}", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
|
|
|
@ -69,6 +69,7 @@ private:
|
|||
TEST_CASE(garbageCode26);
|
||||
TEST_CASE(garbageCode27);
|
||||
TEST_CASE(garbageCode28);
|
||||
TEST_CASE(garbageCode29);
|
||||
|
||||
TEST_CASE(garbageValueFlow);
|
||||
TEST_CASE(garbageSymbolDatabase);
|
||||
|
@ -379,6 +380,11 @@ private:
|
|||
"};\n"), InternalError);
|
||||
}
|
||||
|
||||
void garbageCode29() {
|
||||
// ticket #2601 segmentation fault
|
||||
checkCode("|| #if #define <=");
|
||||
}
|
||||
|
||||
void garbageValueFlow() {
|
||||
// #6089
|
||||
const char* code = "{} int foo(struct, x1, struct x2, x3, int, x5, x6, x7)\n"
|
||||
|
|
|
@ -308,7 +308,7 @@ private:
|
|||
" return;\n"
|
||||
" }\n"
|
||||
" if (!abc);\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (warning) Possible null pointer dereference: abc - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
// TODO: False negative if member of member is dereferenced
|
||||
|
@ -323,7 +323,7 @@ private:
|
|||
" abc->a = 0;\n"
|
||||
" if (abc && abc->b == 0)\n"
|
||||
" ;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Possible null pointer dereference: abc - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
// ok dereferencing in a condition
|
||||
|
@ -560,7 +560,7 @@ private:
|
|||
"{\n"
|
||||
" if (*p == 0) { }\n"
|
||||
" if (!p) { }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
// no error
|
||||
|
@ -597,7 +597,7 @@ private:
|
|||
" int a = 2 * x;"
|
||||
" if (x == 0)\n"
|
||||
" ;\n"
|
||||
"}", true);
|
||||
"}", true, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void foo(int *p)\n"
|
||||
|
@ -823,12 +823,12 @@ private:
|
|||
check("void f(struct ABC *abc) {\n"
|
||||
" WARN_ON(!abc || abc->x == 0);\n"
|
||||
" if (!abc) { }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
check("void f(struct ABC *abc) {\n"
|
||||
" WARN_ON(!abc || abc->x == 7);\n"
|
||||
" if (!abc) { }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// #3425 - false positives when there are macros
|
||||
|
@ -1343,34 +1343,34 @@ private:
|
|||
" if (NULL == p) {\n"
|
||||
" }\n"
|
||||
" *p = 0;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
check("void foo(char *p) {\n"
|
||||
" if (p == NULL) {\n"
|
||||
" }\n"
|
||||
" *p = 0;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
check("void foo(char *p) {\n"
|
||||
" if (p == NULL) {\n"
|
||||
" }\n"
|
||||
" printf(\"%c\", *p);\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
check("void foo(char *p) {\n"
|
||||
" if (p && *p == 0) {\n"
|
||||
" }\n"
|
||||
" printf(\"%c\", *p);\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
check("void foo(char *p) {\n"
|
||||
" if (p && *p == 0) {\n"
|
||||
" } else { *p = 0; }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
check("void foo(char *p) {\n"
|
||||
|
@ -1500,7 +1500,7 @@ private:
|
|||
" MACRO;\n"
|
||||
" }\n"
|
||||
" fred->a();\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// #2493 - switch
|
||||
|
@ -1513,7 +1513,7 @@ private:
|
|||
" fred->a();\n"
|
||||
" break;\n"
|
||||
" };\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// #4118 - second if
|
||||
|
@ -1549,7 +1549,7 @@ private:
|
|||
" else {\n"
|
||||
" int b = *i;\n"
|
||||
" }\n"
|
||||
"}", true);
|
||||
"}", true, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// #2696 - false positives nr 1
|
||||
|
@ -1611,7 +1611,7 @@ private:
|
|||
" if (p == 0 && (p = malloc(10)) != 0) {\n"
|
||||
" *p = 0;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// check, assign and use
|
||||
|
@ -1620,7 +1620,7 @@ private:
|
|||
" if (p == 0 && (p = malloc(10)) != a && (*p = a)) {\n"
|
||||
" *p = 0;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// check, and use
|
||||
|
@ -1629,7 +1629,7 @@ private:
|
|||
" if (p == 0 && (*p = 0)) {\n"
|
||||
" return;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
// check, and use
|
||||
|
@ -1638,7 +1638,7 @@ private:
|
|||
" if (p == 0 && p->x == 10) {\n"
|
||||
" return;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
// check, and use
|
||||
|
@ -1647,7 +1647,7 @@ private:
|
|||
" if (p == 0 || p->x == 10) {\n"
|
||||
" return;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// check, and use
|
||||
|
@ -1656,7 +1656,7 @@ private:
|
|||
" if (p == NULL && (*p = a)) {\n"
|
||||
" return;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
|
||||
// check, and use
|
||||
|
@ -1664,7 +1664,7 @@ private:
|
|||
" if (!p && x==1 || p && p->x==0) {\n"
|
||||
" return;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
{
|
||||
|
@ -1673,17 +1673,17 @@ private:
|
|||
" fred->x();\n"
|
||||
"}";
|
||||
|
||||
check(code); // non-inconclusive
|
||||
check(code, false, "test.cpp", false); // non-inconclusive
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check(code, true); // inconclusive
|
||||
check(code, true, "test.cpp", false); // inconclusive
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning, inconclusive) Possible null pointer dereference: fred - otherwise it is redundant to check it against null.\n", errout.str());
|
||||
}
|
||||
|
||||
check("void f(char *s) {\n" // #3358
|
||||
" if (s==0);\n"
|
||||
" strcpy(a, s?b:c);\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// sizeof
|
||||
|
@ -2054,7 +2054,7 @@ private:
|
|||
" std::cin >> p;\n"
|
||||
" std::cout << abc << p;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
TODO_ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n"
|
||||
"[test.cpp:4] -> [test.cpp:2]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n"
|
||||
"[test.cpp:5] -> [test.cpp:2]: (warning) Possible null pointer dereference: p - otherwise it is redundant to check it against null.\n"
|
||||
|
@ -2281,7 +2281,7 @@ private:
|
|||
check("void f(int *p = 0) {\n"
|
||||
" if (p != 0 && bar())\n"
|
||||
" *p = 0;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(int *p) {\n"
|
||||
|
@ -2292,7 +2292,7 @@ private:
|
|||
check("void f(int *p = 0) {\n"
|
||||
" if (p != 0)\n"
|
||||
" *p = 0;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(int *p = 0) {\n"
|
||||
|
@ -2300,13 +2300,13 @@ private:
|
|||
" if (p == 0)\n"
|
||||
" p = &y;\n"
|
||||
" *p = 0;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(int *p = 0) {\n"
|
||||
" if (a != 0)\n"
|
||||
" *p = 0;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:3]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout.str());
|
||||
|
||||
check("void f(int *p = 0) {\n"
|
||||
|
@ -2326,7 +2326,7 @@ private:
|
|||
" return 0;\n"
|
||||
" }\n"
|
||||
" return *p;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(int *p = 0) {\n"
|
||||
|
@ -2400,7 +2400,7 @@ private:
|
|||
" init(&p);\n"
|
||||
" }\n"
|
||||
" *p = 0;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(int *p = 0) {\n"
|
||||
|
@ -2408,7 +2408,7 @@ private:
|
|||
" throw SomeException;\n"
|
||||
" }\n"
|
||||
" *p = 0;\n"
|
||||
"}");
|
||||
"}", false, "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void foo(int *p = 0) {\n"
|
||||
|
|
|
@ -179,7 +179,7 @@ private:
|
|||
TEST_CASE(redundantPointerOp);
|
||||
}
|
||||
|
||||
void check(const char raw_code[], const char *filename = nullptr, bool experimental = false, bool inconclusive = true, bool posix = false, bool runSimpleChecks=true, Settings* settings = 0) {
|
||||
void check(const char raw_code[], const char *filename = nullptr, bool experimental = false, bool inconclusive = true, bool posix = false, bool runSimpleChecks=true, Settings* settings = 0, bool verify = true) {
|
||||
// Clear the error buffer..
|
||||
errout.str("");
|
||||
|
||||
|
@ -219,7 +219,7 @@ private:
|
|||
const std::string str1(tokenizer.tokens()->stringifyList(0,true));
|
||||
tokenizer.simplifyTokenList2();
|
||||
const std::string str2(tokenizer.tokens()->stringifyList(0,true));
|
||||
if (str1 != str2)
|
||||
if (verify && str1 != str2)
|
||||
warnUnsimplified(str1, str2);
|
||||
checkOther.runSimplifiedChecks(&tokenizer, settings, this);
|
||||
}
|
||||
|
@ -418,13 +418,13 @@ private:
|
|||
check("void f(int x) {\n"
|
||||
" int y = 17 / x;\n"
|
||||
" if (x == 0) {}\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x==0' is useless or there is division by zero at line 2.\n", errout.str());
|
||||
|
||||
check("void f(unsigned int x) {\n"
|
||||
" int y = 17 / x;\n"
|
||||
" if (x != 0) {}\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x!=0' is useless or there is division by zero at line 2.\n", errout.str());
|
||||
|
||||
// function call
|
||||
|
@ -441,7 +441,7 @@ private:
|
|||
" int y = 17 / x;\n"
|
||||
" x = some+calculation;\n"
|
||||
" if (x != 0) {}\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
{
|
||||
|
@ -452,7 +452,7 @@ private:
|
|||
" int y = 17 / x;\n"
|
||||
" do_something();\n"
|
||||
" if (x != 0) {}\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// function is called. but don't care, variable is local
|
||||
|
@ -462,7 +462,7 @@ private:
|
|||
" int y = 17 / x;\n"
|
||||
" do_something();\n"
|
||||
" if (x != 0) {}\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:4]: (warning) Either the condition 'x!=0' is useless or there is division by zero at line 4.\n", errout.str());
|
||||
}
|
||||
|
||||
|
@ -477,7 +477,7 @@ private:
|
|||
"void f() {\n"
|
||||
" int y = 17 / x;\n"
|
||||
" while (y || x == 0) { x--; }\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// ticket 5033 segmentation fault (valid code) in CheckOther::checkZeroDivisionOrUselessCondition
|
||||
|
@ -500,19 +500,19 @@ private:
|
|||
check("int f(int d) {\n"
|
||||
" int r = (a?b:c) / d;\n"
|
||||
" if (d == 0) {}\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'd==0' is useless or there is division by zero at line 2.\n", errout.str());
|
||||
|
||||
check("int f(int a) {\n"
|
||||
" int r = a ? 1 / a : 0;\n"
|
||||
" if (a == 0) {}\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("int f(int a) {\n"
|
||||
" int r = (a == 0) ? 0 : 1 / a;\n"
|
||||
" if (a == 0) {}\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
|
@ -3209,7 +3209,7 @@ private:
|
|||
" for (i == 0; i < 10; i ++) {\n"
|
||||
" c ++;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout.str());
|
||||
|
||||
check("void foo(int c) {\n"
|
||||
|
@ -3266,7 +3266,7 @@ private:
|
|||
" for (int i = (x == 0) ? 0 : 5; i < 10; i ++) {\n"
|
||||
" x++;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void foo(int x) {\n"
|
||||
|
@ -3348,7 +3348,7 @@ private:
|
|||
check("void f(int x) {\n"
|
||||
" x = (x != 0);"
|
||||
" func(x);\n"
|
||||
"}");
|
||||
"}", nullptr, false, true, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// ticket #3001 - false positive
|
||||
|
@ -3749,12 +3749,12 @@ private:
|
|||
void clarifyCalculation() {
|
||||
check("int f(char c) {\n"
|
||||
" return 10 * (c == 0) ? 1 : 2;\n"
|
||||
"}");
|
||||
"}", nullptr, false, false, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '*' and '?'.\n", errout.str());
|
||||
|
||||
check("void f(char c) {\n"
|
||||
" printf(\"%i\", 10 * (c == 0) ? 1 : 2);\n"
|
||||
"}");
|
||||
"}", nullptr, false, false, false, true, nullptr, false);
|
||||
ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '*' and '?'.\n", errout.str());
|
||||
|
||||
check("void f() {\n"
|
||||
|
@ -4264,7 +4264,7 @@ private:
|
|||
|
||||
check("void foo() {\n"
|
||||
" if ((strcmp(a, b) == 0) || (strcmp(a, b) == 0)) {}\n"
|
||||
"}", "test.cpp", false, false, false, true, &settings_std);
|
||||
"}", "test.cpp", false, false, false, true, &settings_std, false);
|
||||
ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str());
|
||||
|
||||
check("void GetValue() { return rand(); }\n"
|
||||
|
|
|
@ -104,7 +104,9 @@ private:
|
|||
TEST_CASE(test_4881); // similar to doWhileAssign (#4911), taken from #4881 with full code
|
||||
|
||||
// "if(0==x)" => "if(!x)"
|
||||
TEST_CASE(ifnot);
|
||||
TEST_CASE(simplifyIfNot);
|
||||
TEST_CASE(simplifyIfNotNull);
|
||||
|
||||
TEST_CASE(combine_wstrings);
|
||||
|
||||
// Simplify "not" to "!" (#345)
|
||||
|
@ -261,7 +263,6 @@ private:
|
|||
TEST_CASE(removeUnnecessaryQualification9); // ticket #3151
|
||||
TEST_CASE(removeUnnecessaryQualification10); // ticket #3310 segmentation fault
|
||||
|
||||
TEST_CASE(simplifyIfNotNull);
|
||||
TEST_CASE(simplifyVarDecl1); // ticket # 2682 segmentation fault
|
||||
TEST_CASE(simplifyVarDecl2); // ticket # 2834 segmentation fault
|
||||
TEST_CASE(return_strncat); // ticket # 2860 Returning value of strncat() reported as memory leak
|
||||
|
@ -1672,17 +1673,24 @@ private:
|
|||
ASSERT_EQUALS("; do { current = f ( ) ; } while ( ( current ) != 0 ) ;", simplifyIfAndWhileAssign(";do { } while((current=f()) != NULL);"));
|
||||
}
|
||||
|
||||
void ifnot() {
|
||||
ASSERT_EQUALS("if ( ! x ) { ; }", tok("if(0==x);", false));
|
||||
ASSERT_EQUALS("if ( ! x ) { ; }", tok("if(x==0);", false));
|
||||
ASSERT_EQUALS("if ( ! ( a = b ) ) { ; }", tok("if(0==(a=b));", false));
|
||||
ASSERT_EQUALS("if ( ! a && b ( ) ) { ; }", tok("if( 0 == a && b() );", false));
|
||||
ASSERT_EQUALS("if ( b ( ) && ! a ) { ; }", tok("if( b() && 0 == a );", false));
|
||||
ASSERT_EQUALS("if ( ! ( a = b ) ) { ; }", tok("if((a=b)==0);", false));
|
||||
ASSERT_EQUALS("if ( ! x . y ) { ; }", tok("if(x.y==0);", false));
|
||||
ASSERT_EQUALS("if ( ! x ) { ; }", tok("if((x==0));", false));
|
||||
ASSERT_EQUALS("if ( ( ! x ) && ! y ) { ; }", tok("if((x==0) && y==0);", false));
|
||||
ASSERT_EQUALS("if ( ! ( ! fclose ( fd ) ) ) { ; }", tok("if(!(fclose(fd) == 0));", false));
|
||||
void simplifyIfNot() {
|
||||
ASSERT_EQUALS("if ( ! x ) { ; }", tok("if(0==x);"));
|
||||
ASSERT_EQUALS("if ( ! x ) { ; }", tok("if(x==0);"));
|
||||
ASSERT_EQUALS("if ( ! ( a = b ) ) { ; }", tok("if(0==(a=b));"));
|
||||
ASSERT_EQUALS("if ( ! a && b ( ) ) { ; }", tok("if( 0 == a && b() );"));
|
||||
ASSERT_EQUALS("if ( b ( ) && ! a ) { ; }", tok("if( b() && 0 == a );"));
|
||||
ASSERT_EQUALS("if ( ! ( a = b ) ) { ; }", tok("if((a=b)==0);"));
|
||||
ASSERT_EQUALS("if ( ! x . y ) { ; }", tok("if(x.y==0);"));
|
||||
ASSERT_EQUALS("if ( ! x ) { ; }", tok("if((x==0));"));
|
||||
ASSERT_EQUALS("if ( ( ! x ) && ! y ) { ; }", tok("if((x==0) && y==0);"));
|
||||
ASSERT_EQUALS("if ( ! ( ! fclose ( fd ) ) ) { ; }", tok("if(!(fclose(fd) == 0));"));
|
||||
}
|
||||
|
||||
void simplifyIfNotNull() {
|
||||
const char code[] = "void f(int x) {\n"
|
||||
" x = (x != 0);\n"
|
||||
"}";
|
||||
ASSERT_EQUALS("void f ( int x ) { }", tok(code, true));
|
||||
}
|
||||
|
||||
void not1() {
|
||||
|
@ -4004,22 +4012,6 @@ private:
|
|||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void simplifyIfNotNull() {
|
||||
{
|
||||
// ticket # 2601 segmentation fault
|
||||
const char code[] = "|| #if #define <=";
|
||||
tok(code, false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] = "void f(int x) {\n"
|
||||
" x = (x != 0);\n"
|
||||
"}";
|
||||
ASSERT_EQUALS("void f ( int x ) { }", tok(code, false));
|
||||
}
|
||||
}
|
||||
|
||||
void simplifyVarDecl1() { // ticket # 2682 segmentation fault
|
||||
const char code[] = "x a[0] =";
|
||||
tok(code, false);
|
||||
|
|
|
@ -395,7 +395,7 @@ private:
|
|||
check("void foo(char* c) {\n"
|
||||
" if(c == '\\0') bar();\n"
|
||||
"}");
|
||||
TODO_ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", "", errout.str());
|
||||
ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", errout.str());
|
||||
|
||||
check("void f() {\n"
|
||||
" struct { struct { char *str; } x; } a;\n"
|
||||
|
|
|
@ -259,7 +259,7 @@ private:
|
|||
TEST_CASE(simplify_constants4);
|
||||
TEST_CASE(simplify_constants5);
|
||||
TEST_CASE(simplify_constants6); // Ticket #5625: Ternary operator as template parameter
|
||||
TEST_CASE(simplify_null);
|
||||
TEST_CASE(simplifyNull);
|
||||
TEST_CASE(simplifyMulAndParens); // Ticket #2784 + #3184
|
||||
|
||||
TEST_CASE(simplifyStructDecl);
|
||||
|
@ -396,8 +396,6 @@ private:
|
|||
TEST_CASE(simplifyOperatorName8); // ticket #5706
|
||||
TEST_CASE(simplifyOperatorName9); // ticket #5709 - comma operator not properly tokenized
|
||||
|
||||
TEST_CASE(simplifyNull);
|
||||
|
||||
TEST_CASE(simplifyNullArray);
|
||||
|
||||
// Some simple cleanups of unhandled macros in the global scope
|
||||
|
@ -1867,7 +1865,7 @@ private:
|
|||
"{"
|
||||
" int i ;"
|
||||
" for ( i = 0 ; i < 10 ; ++ i ) {"
|
||||
" if ( ! * str ) { goto label ; }"
|
||||
" if ( * str == 0 ) { goto label ; }"
|
||||
" }"
|
||||
" return ;"
|
||||
" label : ;"
|
||||
|
@ -3336,7 +3334,7 @@ private:
|
|||
" return;"
|
||||
"}";
|
||||
|
||||
ASSERT_EQUALS("void foo ( ) { if ( ! s ) { return ; } }", tokenizeAndStringify(code));
|
||||
ASSERT_EQUALS("void foo ( ) { if ( s == 0 ) { return ; } }", tokenizeAndStringify(code));
|
||||
}
|
||||
|
||||
void removeParentheses3() {
|
||||
|
@ -3449,7 +3447,7 @@ private:
|
|||
}
|
||||
|
||||
void removeParentheses14() {
|
||||
ASSERT_EQUALS("; if ( ! ( i & 1 ) ) { ; } ;", tokenizeAndStringify("; if ( (i & 1) == 0 ); ;", false));
|
||||
ASSERT_EQUALS("; if ( ( i & 1 ) == 0 ) { ; } ;", tokenizeAndStringify("; if ( (i & 1) == 0 ); ;", false));
|
||||
}
|
||||
|
||||
void removeParentheses15() {
|
||||
|
@ -3678,7 +3676,7 @@ private:
|
|||
}
|
||||
}
|
||||
|
||||
void simplify_null() {
|
||||
void simplifyNull() {
|
||||
{
|
||||
const char code[] =
|
||||
"int * p = NULL;\n"
|
||||
|
@ -3689,7 +3687,11 @@ private:
|
|||
}
|
||||
|
||||
ASSERT_EQUALS("( a == nullptr )", tokenizeAndStringify("(a==nullptr)", false, false, Settings::Unspecified, "test.c"));
|
||||
ASSERT_EQUALS("( ! a )", tokenizeAndStringify("(a==nullptr)", false, false, Settings::Unspecified, "test.cpp"));
|
||||
ASSERT_EQUALS("( a == 0 )", tokenizeAndStringify("(a==nullptr)", false, false, Settings::Unspecified, "test.cpp"));
|
||||
|
||||
ASSERT_EQUALS("if ( p == 0 )", tokenizeAndStringify("if (p==NULL)"));
|
||||
ASSERT_EQUALS("f ( NULL ) ;", tokenizeAndStringify("f(NULL);"));
|
||||
ASSERT_EQUALS("char * i ; i = 0 ;", tokenizeAndStringify("char* i = (NULL);"));
|
||||
}
|
||||
|
||||
void simplifyMulAndParens() {
|
||||
|
@ -6217,12 +6219,6 @@ private:
|
|||
ASSERT_EQUALS(code, tokenizeAndStringify(code));
|
||||
}
|
||||
|
||||
void simplifyNull() {
|
||||
ASSERT_EQUALS("if ( ! p )", tokenizeAndStringify("if (p==NULL)"));
|
||||
ASSERT_EQUALS("f ( NULL ) ;", tokenizeAndStringify("f(NULL);"));
|
||||
ASSERT_EQUALS("char * i ; i = 0 ;", tokenizeAndStringify("char* i = (NULL);"));
|
||||
}
|
||||
|
||||
void simplifyNullArray() {
|
||||
ASSERT_EQUALS("* ( foo . bar [ 5 ] ) = x ;", tokenizeAndStringify("0[foo.bar[5]] = x;"));
|
||||
}
|
||||
|
|
|
@ -2555,7 +2555,7 @@ private:
|
|||
checkUninitVar2("static void f(int x, int y) {\n"
|
||||
" int a;\n"
|
||||
" if (x == 0 && (a == 1)) { }\n"
|
||||
"}");
|
||||
"}", "test.cpp", false);
|
||||
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str());
|
||||
|
||||
checkUninitVarB("void f() {\n"
|
||||
|
@ -3002,7 +3002,7 @@ private:
|
|||
" if (y != 0) return;\n"
|
||||
" i++;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar2("void f() {\n"
|
||||
|
@ -3012,7 +3012,7 @@ private:
|
|||
" if (y != 0) return;\n"
|
||||
" i++;\n"
|
||||
" }\n"
|
||||
"}");
|
||||
"}", "test.cpp", false);
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVarB("void f() {\n"
|
||||
|
@ -3399,7 +3399,7 @@ private:
|
|||
" struct FRED fred;\n"
|
||||
" fred.a = do_something();\n"
|
||||
" if (fred.b == 0) { }\n"
|
||||
"}\n", "test.c");
|
||||
"}\n", "test.c", false);
|
||||
ASSERT_EQUALS("[test.c:9]: (error) Uninitialized struct member: fred.b\n", errout.str());
|
||||
|
||||
checkUninitVar2("struct Fred { int a; };\n"
|
||||
|
|
Loading…
Reference in New Issue