Skip to content

Commit 6fc12c3

Browse files
Fix #15114 FP shadowVariable (global variable prior to declaration) (#8947)
1 parent 033ce38 commit 6fc12c3

2 files changed

Lines changed: 28 additions & 9 deletions

File tree

‎lib/checkother.cpp‎

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4223,12 +4223,12 @@ void CheckOtherImpl::funcArgOrderDifferent(const std::string & functionName,
42234223
reportError(tokens, Severity::warning, "funcArgOrderDifferent", msg, CWE683, Certainty::normal);
42244224
}
42254225

4226-
static const Token *findShadowed(const Scope *scope, const Variable& var, int linenr)
4226+
static const Token *findShadowed(const Scope *scope, const Variable& var)
42274227
{
42284228
if (!scope)
42294229
return nullptr;
42304230
for (const Variable &v : scope->varlist) {
4231-
if (scope->isExecutable() && v.nameToken()->linenr() > linenr)
4231+
if ((scope->isExecutable() || scope->type == ScopeType::eGlobal) && succeeds(v.nameToken(), var.nameToken()))
42324232
continue;
42334233
if (v.name() == var.name())
42344234
return v.nameToken();
@@ -4242,9 +4242,9 @@ static const Token *findShadowed(const Scope *scope, const Variable& var, int li
42424242

42434243
if (scope->type == ScopeType::eLambda)
42444244
return nullptr;
4245-
const Token* shadowed = findShadowed(scope->nestedIn, var, linenr);
4245+
const Token* shadowed = findShadowed(scope->nestedIn, var);
42464246
if (!shadowed)
4247-
shadowed = findShadowed(scope->functionOf, var, linenr);
4247+
shadowed = findShadowed(scope->functionOf, var);
42484248
return shadowed;
42494249
}
42504250

@@ -4278,9 +4278,9 @@ void CheckOtherImpl::checkShadowVariables()
42784278
}
42794279
}
42804280

4281-
const Token *shadowed = findShadowed(scope.nestedIn, var, var.nameToken()->linenr());
4281+
const Token *shadowed = findShadowed(scope.nestedIn, var);
42824282
if (!shadowed)
4283-
shadowed = findShadowed(scope.functionOf, var, var.nameToken()->linenr());
4283+
shadowed = findShadowed(scope.functionOf, var);
42844284
if (!shadowed)
42854285
return;
42864286
if (scope.type == ScopeType::eFunction && scope.className == var.name())
@@ -4314,9 +4314,10 @@ void CheckOtherImpl::checkShadowVariables()
43144314
void CheckOtherImpl::shadowError(const Token *shadows, const std::string &shadowsType,
43154315
const Token *shadowed, const std::string &shadowedType)
43164316
{
4317-
ErrorPath errorPath;
4318-
errorPath.emplace_back(shadowed, "Shadowed " + shadowedType);
4319-
errorPath.emplace_back(shadows, "Shadow " + shadowsType);
4317+
ErrorPath errorPath{
4318+
{shadowed, "Shadowed " + shadowedType},
4319+
{shadows, "Shadow " + shadowsType}
4320+
};
43204321
const std::string &varname = shadows ? shadows->str() : shadowsType;
43214322
const std::string ShadowsType = char(std::toupper(shadowsType[0])) + shadowsType.substr(1);
43224323
const std::string ShadowedType = char(std::toupper(shadowedType[0])) + shadowedType.substr(1);

‎test/testother.cpp‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13555,6 +13555,24 @@ class TestOther : public TestFixture {
1355513555

1355613556
check("struct S { void g(float f) {} void f() {} };\n");
1355713557
ASSERT_EQUALS("[test.cpp:1:36] -> [test.cpp:1:25]: (style) Argument 'f' shadows outer function [shadowFunction]\n", errout_str());
13558+
13559+
check("int f() {\n" // #15114
13560+
" int i = 0;\n"
13561+
" return i;\n"
13562+
"}\n"
13563+
"int i = 1;\n");
13564+
ASSERT_EQUALS("", errout_str());
13565+
13566+
{
13567+
ScopedFile inc("test.h", "int pad1;\nint pad2;\nint pad3;\nint pad4;\nfloat f;\n");
13568+
checkP("void g() {\n"
13569+
" #include \"test.h\"\n"
13570+
" {\n"
13571+
" float f;\n"
13572+
" }\n"
13573+
"}\n");
13574+
ASSERT_EQUALS("[test.h:5:7] -> [test.cpp:4:15]: (style) Local variable 'f' shadows outer variable [shadowVariable]\n", errout_str());
13575+
}
1355813576
}
1355913577

1356013578
void knownArgument() {

0 commit comments

Comments
 (0)