Fix FP const pointer with class variable and add more tests (#3345)

This commit is contained in:
Paul Fultz II 2021-07-21 00:36:13 -05:00 committed by GitHub
parent 8efe1d4ab4
commit 41c94b656a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 73 additions and 0 deletions

View File

@ -1462,6 +1462,8 @@ void CheckOther::checkConstPointer()
for (const Token *tok = mTokenizer->tokens(); tok; tok = tok->next()) {
if (!tok->variable())
continue;
if (!tok->variable()->isLocal() && !tok->variable()->isArgument())
continue;
if (tok == tok->variable()->nameToken())
continue;
if (!tok->valueType())

View File

@ -2674,6 +2674,76 @@ private:
check("void foo(int *p) { return *p > 1; }");
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() {

View File

@ -121,6 +121,7 @@ extern std::ostringstream output;
#define TEST_CASE( NAME ) do { if ( prepareTest(#NAME) ) { setVerbose(false); NAME(); } } while(false)
#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_WITHOUT_LINENUMBERS( EXPECTED , ACTUAL ) assertEqualsWithoutLineNumbers(__FILE__, __LINE__, EXPECTED, ACTUAL)
#define ASSERT_EQUALS_DOUBLE( EXPECTED , ACTUAL, TOLERANCE ) assertEqualsDouble(__FILE__, __LINE__, EXPECTED, ACTUAL, TOLERANCE)