Updated Token::expressionString(), write '->' instead of '.'

This commit is contained in:
Daniel Marjamäki 2017-04-30 14:22:18 +02:00
parent 28960a8bba
commit 7fd04cd8d0
5 changed files with 28 additions and 14 deletions

View File

@ -1200,13 +1200,17 @@ static const Token* goToRightParenthesis(const Token* start, const Token* end)
static std::string stringFromTokenRange(const Token* start, const Token* end) static std::string stringFromTokenRange(const Token* start, const Token* end)
{ {
std::string ret; std::ostringstream ret;
for (const Token *tok = start; tok && tok != end; tok = tok->next()) { for (const Token *tok = start; tok && tok != end; tok = tok->next()) {
ret += tok->str(); if (tok->originalName() == "->")
ret << "->";
else
ret << tok->str();
if (Token::Match(tok, "%name%|%num% %name%|%num%")) if (Token::Match(tok, "%name%|%num% %name%|%num%"))
ret += " "; ret << ' ';
} }
return ret + end->str(); ret << end->str();
return ret.str();
} }
std::string Token::expressionString() const std::string Token::expressionString() const

View File

@ -460,7 +460,8 @@ private:
" struct ABC* x = malloc(sizeof(struct ABC) + 10);\n" " struct ABC* x = malloc(sizeof(struct ABC) + 10);\n"
" x->str[1] = 0;" " x->str[1] = 0;"
"}"); "}");
ASSERT_EQUALS("[test.cpp:10]: (error) Array 'x.str[1]' accessed at index 1, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:10]: (error) Array 'x->str[1]' accessed at index 1, which is out of bounds.\n"
"[test.cpp:10]: (error) Array 'x.str[1]' accessed at index 1, which is out of bounds.\n", errout.str());
// This is not out of bounds because it is a variable length array // This is not out of bounds because it is a variable length array
// and the index is within the memory allocated. // and the index is within the memory allocated.
@ -582,7 +583,8 @@ private:
"{\n" "{\n"
" abc->str[10] = 0;\n" " abc->str[10] = 0;\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:8]: (error) Array 'abc.str[10]' accessed at index 10, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:8]: (error) Array 'abc->str[10]' accessed at index 10, which is out of bounds.\n"
"[test.cpp:8]: (error) Array 'abc.str[10]' accessed at index 10, which is out of bounds.\n", errout.str());
} }
void array_index_9() { void array_index_9() {
@ -669,7 +671,8 @@ private:
" abc->str[10] = 0;\n" " abc->str[10] = 0;\n"
" }\n" " }\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:13]: (error) Array 'abc.str[10]' accessed at index 10, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:13]: (error) Array 'abc->str[10]' accessed at index 10, which is out of bounds.\n"
"[test.cpp:13]: (error) Array 'abc.str[10]' accessed at index 10, which is out of bounds.\n", errout.str());
} }
void array_index_12() { void array_index_12() {
@ -1131,6 +1134,9 @@ private:
ASSERT_EQUALS("[test.cpp:9]: (error) Array 'test.a[10]' accessed at index 10, which is out of bounds.\n" ASSERT_EQUALS("[test.cpp:9]: (error) Array 'test.a[10]' accessed at index 10, which is out of bounds.\n"
"[test.cpp:10]: (error) Array 'test.b[10][5]' index test.b[10][2] out of bounds.\n" "[test.cpp:10]: (error) Array 'test.b[10][5]' index test.b[10][2] out of bounds.\n"
"[test.cpp:11]: (error) Array 'test.b[10][5]' index test.b[0][19] out of bounds.\n" "[test.cpp:11]: (error) Array 'test.b[10][5]' index test.b[0][19] out of bounds.\n"
"[test.cpp:14]: (error) Array 'ptest->a[10]' accessed at index 10, which is out of bounds.\n"
"[test.cpp:15]: (error) Array 'ptest->b[10][5]' index ptest->b[10][2] out of bounds.\n"
"[test.cpp:16]: (error) Array 'ptest->b[10][5]' index ptest->b[0][19] out of bounds.\n"
"[test.cpp:14]: (error) Array 'ptest.a[10]' accessed at index 10, which is out of bounds.\n" "[test.cpp:14]: (error) Array 'ptest.a[10]' accessed at index 10, which is out of bounds.\n"
"[test.cpp:15]: (error) Array 'ptest.b[10][5]' index ptest.b[10][2] out of bounds.\n" "[test.cpp:15]: (error) Array 'ptest.b[10][5]' index ptest.b[10][2] out of bounds.\n"
"[test.cpp:16]: (error) Array 'ptest.b[10][5]' index ptest.b[0][19] out of bounds.\n", errout.str()); "[test.cpp:16]: (error) Array 'ptest.b[10][5]' index ptest.b[0][19] out of bounds.\n", errout.str());
@ -1151,6 +1157,8 @@ private:
"}"); "}");
ASSERT_EQUALS("[test.cpp:8]: (error) Array 'test.a[10][5]' index test.a[9][5] out of bounds.\n" ASSERT_EQUALS("[test.cpp:8]: (error) Array 'test.a[10][5]' index test.a[9][5] out of bounds.\n"
"[test.cpp:9]: (error) Array 'test.a[10][5]' index test.a[0][50] out of bounds.\n" "[test.cpp:9]: (error) Array 'test.a[10][5]' index test.a[0][50] out of bounds.\n"
"[test.cpp:12]: (error) Array 'ptest->a[10][5]' index ptest->a[9][5] out of bounds.\n"
"[test.cpp:13]: (error) Array 'ptest->a[10][5]' index ptest->a[0][50] out of bounds.\n"
"[test.cpp:12]: (error) Array 'ptest.a[10][5]' index ptest.a[9][5] out of bounds.\n" "[test.cpp:12]: (error) Array 'ptest.a[10][5]' index ptest.a[9][5] out of bounds.\n"
"[test.cpp:13]: (error) Array 'ptest.a[10][5]' index ptest.a[0][50] out of bounds.\n", errout.str()); "[test.cpp:13]: (error) Array 'ptest.a[10][5]' index ptest.a[0][50] out of bounds.\n", errout.str());
} }
@ -2056,7 +2064,8 @@ private:
" struct tt *tt=x;\n" " struct tt *tt=x;\n"
" tt->name[22] = 123;\n" " tt->name[22] = 123;\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:7]: (error) Array 'tt.name[21]' accessed at index 22, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:7]: (error) Array 'tt->name[21]' accessed at index 22, which is out of bounds.\n"
"[test.cpp:7]: (error) Array 'tt.name[21]' accessed at index 22, which is out of bounds.\n", errout.str());
} }
void array_index_valueflow() { void array_index_valueflow() {
@ -2908,7 +2917,8 @@ private:
" Fred *f; f = new Fred;\n" " Fred *f; f = new Fred;\n"
" return f->c[10];\n" " return f->c[10];\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:5]: (error) Array 'f.c[10]' accessed at index 10, which is out of bounds.\n", errout.str()); ASSERT_EQUALS("[test.cpp:5]: (error) Array 'f->c[10]' accessed at index 10, which is out of bounds.\n"
"[test.cpp:5]: (error) Array 'f.c[10]' accessed at index 10, which is out of bounds.\n", errout.str());
check("static const size_t MAX_SIZE = UNAVAILABLE_TO_CPPCHECK;\n" check("static const size_t MAX_SIZE = UNAVAILABLE_TO_CPPCHECK;\n"
"struct Thing { char data[MAX_SIZE]; };\n" "struct Thing { char data[MAX_SIZE]; };\n"

View File

@ -1583,7 +1583,7 @@ private:
" if (!tok->next()->function() || \n" " if (!tok->next()->function() || \n"
" (tok->next()->function() && tok->next()->function()->isConstructor()));\n" " (tok->next()->function() && tok->next()->function()->isConstructor()));\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: tok.next().function(). '!A || (A && B)' is equivalent to '!A || B'\n", errout.str()); ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: tok->next()->function(). '!A || (A && B)' is equivalent to '!A || B'\n", errout.str());
check("void f() {\n" check("void f() {\n"
" if (!tok->next()->function() || \n" " if (!tok->next()->function() || \n"
@ -1601,7 +1601,7 @@ private:
" if (!tok->next(1)->function(1) || \n" " if (!tok->next(1)->function(1) || \n"
" (tok->next(1)->function(1) && tok->next(1)->function(1)->isConstructor()));\n" " (tok->next(1)->function(1) && tok->next(1)->function(1)->isConstructor()));\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: tok.next(1).function(1). '!A || (A && B)' is equivalent to '!A || B'\n", errout.str()); ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: tok->next(1)->function(1). '!A || (A && B)' is equivalent to '!A || B'\n", errout.str());
check("void f() {\n" check("void f() {\n"
" if (!tok->next()->function(1) || \n" " if (!tok->next()->function(1) || \n"

View File

@ -323,7 +323,7 @@ private:
" if (abc && abc->b == 0)\n" " if (abc && abc->b == 0)\n"
" ;\n" " ;\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'if(abc&&abc.b==0)' is redundant or there is possible null pointer dereference: abc.\n", errout.str()); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'if(abc&&abc->b==0)' is redundant or there is possible null pointer dereference: abc.\n", errout.str());
// ok dereferencing in a condition // ok dereferencing in a condition
check("void foo(struct ABC *abc)\n" check("void foo(struct ABC *abc)\n"

View File

@ -2764,7 +2764,7 @@ private:
"void foo(A* a1, A* a2) {\n" "void foo(A* a1, A* a2) {\n"
" a1->b = a1->b;\n" " a1->b = a1->b;\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:3]: (warning) Redundant assignment of 'a1.b' to itself.\n", errout.str()); ASSERT_EQUALS("[test.cpp:3]: (warning) Redundant assignment of 'a1->b' to itself.\n", errout.str());
// #4073 (segmentation fault) // #4073 (segmentation fault)
check("void Foo::myFunc( int a )\n" check("void Foo::myFunc( int a )\n"
@ -2834,7 +2834,7 @@ private:
"void Foo::func() {\n" "void Foo::func() {\n"
" this->var = var;\n" " this->var = var;\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:6]: (warning) Redundant assignment of 'this.var' to itself.\n", errout.str()); ASSERT_EQUALS("[test.cpp:6]: (warning) Redundant assignment of 'this->var' to itself.\n", errout.str());
check("class Foo {\n" check("class Foo {\n"
" int var;\n" " int var;\n"