Updated Token::expressionString(), write '->' instead of '.'
This commit is contained in:
parent
28960a8bba
commit
7fd04cd8d0
|
@ -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
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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"
|
||||||
|
|
Loading…
Reference in New Issue