Skip to content

Commit 163fb79

Browse files
Fix #11732 FP autoVariables when reassigning argv (#5084)
1 parent 6474325 commit 163fb79

2 files changed

Lines changed: 12 additions & 3 deletions

File tree

lib/checkautovariables.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,10 @@ static bool isPtrArg(const Token *tok)
5555
return (var && var->isArgument() && var->isPointer());
5656
}
5757

58-
static bool isArrayArg(const Token *tok)
58+
static bool isArrayArg(const Token *tok, const Settings* settings)
5959
{
6060
const Variable *var = tok->variable();
61-
return (var && var->isArgument() && var->isArray());
61+
return (var && var->isArgument() && var->isArray() && !settings->library.isentrypoint(var->scope()->className));
6262
}
6363

6464
static bool isArrayVar(const Token *tok)
@@ -266,7 +266,7 @@ void CheckAutoVariables::autoVariables()
266266
}
267267
tok = tok->tokAt(4);
268268
} else if (Token::Match(tok, "[;{}] %var% [") && Token::simpleMatch(tok->linkAt(2), "] =") &&
269-
(isPtrArg(tok->next()) || isArrayArg(tok->next())) && isAddressOfLocalVariable(tok->linkAt(2)->next()->astOperand2())) {
269+
(isPtrArg(tok->next()) || isArrayArg(tok->next(), mSettings)) && isAddressOfLocalVariable(tok->linkAt(2)->next()->astOperand2())) {
270270
errorAutoVariableAssignment(tok->next(), false);
271271
}
272272
// Invalid pointer deallocation

test/testautovariables.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ class TestAutoVariables : public TestFixture {
6868
TEST_CASE(testautovar16); // ticket #8114
6969
TEST_CASE(testautovar_array1);
7070
TEST_CASE(testautovar_array2);
71+
TEST_CASE(testautovar_array3);
7172
TEST_CASE(testautovar_normal); // "normal" token list that does not remove casts etc
7273
TEST_CASE(testautovar_ptrptr); // ticket #6956
7374
TEST_CASE(testautovar_return1);
@@ -517,6 +518,14 @@ class TestAutoVariables : public TestFixture {
517518
ASSERT_EQUALS("[test.cpp:6]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str());
518519
}
519520

521+
void testautovar_array3() {
522+
check("int main(int argc, char* argv[]) {\n" // #11732
523+
" std::string a = \"abc\";\n"
524+
" argv[0] = &a[0];\n"
525+
"}\n");
526+
ASSERT_EQUALS("", errout.str());
527+
}
528+
520529
void testautovar_normal() {
521530
check("void f(XmDestinationCallbackStruct *ds)\n"
522531
"{\n"

0 commit comments

Comments
 (0)