Fix #12119 FN constVariablePointer with reassigned pointer (#5592)

This commit is contained in:
chrchr-github 2023-10-28 16:48:39 +02:00 committed by GitHub
parent cae27c5ec7
commit 77bfec4317
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 15 additions and 11 deletions

View File

@ -2543,11 +2543,12 @@ bool isVariableChanged(const Token *tok, int indirect, const Settings *settings,
tok2 = skipRedundantPtrOp(tok2, tok2->astParent());
if (tok2->astParent() && tok2->astParent()->isAssignmentOp()) {
if (tok2 == tok2->astParent()->astOperand1())
if ((indirect == 0 || tok2 != tok) && tok2 == tok2->astParent()->astOperand1())
return true;
// Check if assigning to a non-const lvalue
const Variable * var = getLHSVariable(tok2->astParent());
if (var && var->isReference() && !var->isConst() && var->nameToken() && var->nameToken()->next() == tok2->astParent()) {
if (var && var->isReference() && !var->isConst() &&
((var->nameToken() && var->nameToken()->next() == tok2->astParent()) || var->isPointer())) {
if (!var->isLocal() || isVariableChanged(var, settings, cpp, depth - 1))
return true;
}

View File

@ -1705,6 +1705,8 @@ void CheckOther::checkConstPointer()
continue;
if (p->isArgument() && p->typeStartToken() && p->typeStartToken()->isSimplifiedTypedef() && !(Token::simpleMatch(p->typeEndToken(), "*") && !p->typeEndToken()->isSimplifiedTypedef()))
continue;
if (p->typeStartToken() && !p->typeStartToken()->originalName().empty())
continue;
constVariableError(p, p->isArgument() ? p->scope()->function : nullptr);
}
}

View File

@ -992,7 +992,7 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList)
mData->enumValue = 0;
Token *enumtok = addtoken(tokenList, "enum");
Token *nametok = nullptr;
const Token *nametok = nullptr;
{
int nameIndex = mExtTokens.size() - 1;
while (nameIndex > colIndex && mExtTokens[nameIndex][0] == '\'')

View File

@ -1914,6 +1914,7 @@ void TokenList::simplifyPlatformTypes()
tok = tok->previous();
tok->deleteThis();
}
tok->originalName(tok->str());
Token *typeToken;
if (platformtype->mConstPtr) {
tok->str("const");
@ -1930,7 +1931,6 @@ void TokenList::simplifyPlatformTypes()
tok->insertToken("*");
tok->insertToken("*");
} else {
tok->originalName(tok->str());
tok->str(platformtype->mType);
typeToken = tok;
}

View File

@ -269,7 +269,7 @@ void g_new_if_test()
int b;
};
struct a * pNew3;
const struct a * pNew3;
if (pNew3 = g_new(struct a, 6)) {
printf("%p", pNew3);
}

View File

@ -8946,14 +8946,14 @@ private:
" state_t *x = NULL;\n"
" x = dostuff();\n"
"}");
ASSERT_EQUALS("", errout.str());
ASSERT_EQUALS("test.cpp:2:style:Variable 'x' can be declared as pointer to const\n", errout.str());
check("void f() {\n"
" state_t *x;\n"
" x = NULL;\n"
" x = dostuff();\n"
"}");
ASSERT_EQUALS("", errout.str());
ASSERT_EQUALS("test.cpp:2:style:Variable 'x' can be declared as pointer to const\n", errout.str());
check("int foo() {\n" // #4420
" int x;\n"
@ -9086,7 +9086,8 @@ private:
" barney(x);\n"
" }\n"
"}");
ASSERT_EQUALS("test.cpp:2:style:The scope of the variable 'p' can be reduced.\n",
ASSERT_EQUALS("test.cpp:2:style:The scope of the variable 'p' can be reduced.\n"
"test.cpp:2:style:Variable 'p' can be declared as pointer to const\n",
errout.str());
check("void foo() {\n"
@ -9178,14 +9179,14 @@ private:
" a = (void*)0;\n"
" a = p;\n"
"}");
ASSERT_EQUALS("", errout.str());
ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'a' can be declared as pointer to const\n", errout.str());
check("void f() {\n"
" void* a;\n"
" a = (void*)0U;\n"
" a = p;\n"
"}");
ASSERT_EQUALS("", errout.str());
ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'a' can be declared as pointer to const\n", errout.str());
}
void redundantVarAssignment_struct() {
@ -9442,7 +9443,7 @@ private:
" int *p = NULL;\n"
" p = dostuff();\n"
"}");
ASSERT_EQUALS("", errout.str());
ASSERT_EQUALS("test.cpp:2:style:Variable 'p' can be declared as pointer to const\n", errout.str());
// "trivial" initialization => do not warn
check("void f() {\n"