Fix FP const pointer with class variable and add more tests (#3345)
This commit is contained in:
parent
8efe1d4ab4
commit
41c94b656a
|
@ -1462,6 +1462,8 @@ void CheckOther::checkConstPointer()
|
||||||
for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) {
|
for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) {
|
||||||
if (!tok->variable())
|
if (!tok->variable())
|
||||||
continue;
|
continue;
|
||||||
|
if (!tok->variable()->isLocal() && !tok->variable()->isArgument())
|
||||||
|
continue;
|
||||||
if (tok == tok->variable()->nameToken())
|
if (tok == tok->variable()->nameToken())
|
||||||
continue;
|
continue;
|
||||||
if (!tok->valueType())
|
if (!tok->valueType())
|
||||||
|
|
|
@ -2674,6 +2674,76 @@ private:
|
||||||
|
|
||||||
check("void foo(int *p) { return *p > 1; }");
|
check("void foo(int *p) { return *p > 1; }");
|
||||||
ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared with const\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared with const\n", errout.str());
|
||||||
|
|
||||||
|
check("void foo(const int* c) { if (c == 0) {}; }");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct a { void b(); };\n"
|
||||||
|
"struct c {\n"
|
||||||
|
" a* d;\n"
|
||||||
|
" a& g() { return *d; }\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct a { void b(); };\n"
|
||||||
|
"struct c { a* d; };\n"
|
||||||
|
"void e(c);\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct V {\n"
|
||||||
|
" V& get(typename std::vector<V>::size_type i, std::vector<V>* arr) {\n"
|
||||||
|
" return arr->at(i);\n"
|
||||||
|
" }\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct A {};\n"
|
||||||
|
"struct B : A {};\n"
|
||||||
|
"B* f(A* x) {\n"
|
||||||
|
" return static_cast<B*>(x);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("int f(std::vector<int>* x) {\n"
|
||||||
|
" int& i = (*x)[0];\n"
|
||||||
|
" i++;\n"
|
||||||
|
" return i;\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct A { int a; };\n"
|
||||||
|
"A f(std::vector<A>* x) {\n"
|
||||||
|
" x->front().a = 1;\n"
|
||||||
|
" return x->front();\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f(std::vector<int>* v) {\n"
|
||||||
|
" for(auto&& x:*v)\n"
|
||||||
|
" x = 1;\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("struct A {\n"
|
||||||
|
" int* x;\n"
|
||||||
|
" A(int* y) : x(y)\n"
|
||||||
|
" {}\n"
|
||||||
|
"};");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f(bool b, int* x, int* y) {\n"
|
||||||
|
" int* z = x;\n"
|
||||||
|
" int* w = b ? y : z;\n"
|
||||||
|
" *w = 1;\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f(bool b, int* x, int* y) {\n"
|
||||||
|
" int& z = *x;\n"
|
||||||
|
" int& w = b ? *y : z;\n"
|
||||||
|
" w = 1;\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void switchRedundantAssignmentTest() {
|
void switchRedundantAssignmentTest() {
|
||||||
|
|
|
@ -121,6 +121,7 @@ extern std::ostringstream output;
|
||||||
|
|
||||||
#define TEST_CASE( NAME ) do { if ( prepareTest(#NAME) ) { setVerbose(false); NAME(); } } while(false)
|
#define TEST_CASE( NAME ) do { if ( prepareTest(#NAME) ) { setVerbose(false); NAME(); } } while(false)
|
||||||
#define ASSERT( CONDITION ) if (!assert_(__FILE__, __LINE__, (CONDITION))) return
|
#define ASSERT( CONDITION ) if (!assert_(__FILE__, __LINE__, (CONDITION))) return
|
||||||
|
#define CHECK_EQUALS( EXPECTED , ACTUAL ) assertEquals(__FILE__, __LINE__, (EXPECTED), (ACTUAL))
|
||||||
#define ASSERT_EQUALS( EXPECTED , ACTUAL ) if (!assertEquals(__FILE__, __LINE__, (EXPECTED), (ACTUAL))) return
|
#define ASSERT_EQUALS( EXPECTED , ACTUAL ) if (!assertEquals(__FILE__, __LINE__, (EXPECTED), (ACTUAL))) return
|
||||||
#define ASSERT_EQUALS_WITHOUT_LINENUMBERS( EXPECTED , ACTUAL ) assertEqualsWithoutLineNumbers(__FILE__, __LINE__, EXPECTED, ACTUAL)
|
#define ASSERT_EQUALS_WITHOUT_LINENUMBERS( EXPECTED , ACTUAL ) assertEqualsWithoutLineNumbers(__FILE__, __LINE__, EXPECTED, ACTUAL)
|
||||||
#define ASSERT_EQUALS_DOUBLE( EXPECTED , ACTUAL, TOLERANCE ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL, TOLERANCE)
|
#define ASSERT_EQUALS_DOUBLE( EXPECTED , ACTUAL, TOLERANCE ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL, TOLERANCE)
|
||||||
|
|
Loading…
Reference in New Issue