Fix #10315 FP functionConst (#3997)

* Fix #10315 FP functionConst

* Update releasenotes.txt
This commit is contained in:
chrchr-github 2022-04-11 22:55:16 +02:00 committed by GitHub
parent 28a024ac4a
commit 00badff622
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 29 additions and 2 deletions

View File

@ -2207,8 +2207,12 @@ bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, bool&
if (v && v->isMutable())
continue;
if (tok1->str() == "this" && tok1->previous()->isAssignmentOp())
return false;
if (tok1->str() == "this") {
if (tok1->previous()->isAssignmentOp())
return false;
if (Token::Match(tok1->previous(), "( this . * %var% )")) // call using ptr to member function TODO: check constness
return false;
}
// non const pointer cast
if (tok1->valueType() && tok1->valueType()->pointer > 0 && tok1->astParent() && tok1->astParent()->isCast() && !Token::simpleMatch(tok1->astParent(), "( const"))

View File

@ -12,3 +12,5 @@ release notes for cppcheck-2.8
- Detect more statements with constStatement
- Detect variableScope for more types
- Improvements to unreadVariable
- Detect more instances of C style casts
- Warn if the return value of new is discarded

View File

@ -194,6 +194,7 @@ private:
TEST_CASE(const75); // ticket #10065
TEST_CASE(const76); // ticket #10825
TEST_CASE(const77); // ticket #10307
TEST_CASE(const78); // ticket #10315
TEST_CASE(const_handleDefaultParameters);
TEST_CASE(const_passThisToMemberOfOtherClass);
TEST_CASE(assigningPointerToPointerIsNotAConstOperation);
@ -6041,6 +6042,26 @@ private:
ASSERT_EQUALS("", errout.str());
}
void const78() { // #10315
checkConst("struct S {\n"
" typedef void(S::* F)();\n"
" void g(F f);\n"
"};\n"
"void S::g(F f) {\n"
" (this->*f)();\n"
"}\n");
ASSERT_EQUALS("", errout.str());
checkConst("struct S {\n"
" using F = void(S::*)();\n"
" void g(F f);\n"
"};\n"
"void S::g(F f) {\n"
" (this->*f)();\n"
"}\n");
ASSERT_EQUALS("", errout.str());
}
void const_handleDefaultParameters() {
checkConst("struct Foo {\n"
" void foo1(int i, int j = 0) {\n"