diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index a98ba73429c..496ca6905a1 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -1086,9 +1086,11 @@ void CheckBufferOverrunImpl::objectIndex() std::vector values = ValueFlow::getLifetimeObjValues(obj, false, -1); for (const ValueFlow::Value& v:values) { - if (v.lifetimeKind != ValueFlow::Value::LifetimeKind::Address) + if (v.lifetimeKind != ValueFlow::Value::LifetimeKind::Address && v.lifetimeKind != ValueFlow::Value::LifetimeKind::Object) continue; - const Variable *var = v.tokvalue->variable(); + const Token* varTok = nextAfterAstRightmostLeaf(v.tokvalue->astParent()); + varTok = varTok ? varTok->previous() : nullptr; + const Variable *var = varTok ? varTok->variable() : nullptr; if (!var) continue; if (var->isReference()) diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index e1da77ccbfb..e51a1708389 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -5857,7 +5857,9 @@ class TestBufferOverrun : public TestFixture { " (void)y[1];\n" " (void)y[2];\n" "}\n"); - TODO_ASSERT_EQUALS("error", "", errout_str()); + ASSERT_EQUALS("[test.cpp:7:20] -> [test.cpp:9:12]: (error) The address of variable 's.a' is accessed at non-zero index. [objectIndex]\n" + "[test.cpp:7:20] -> [test.cpp:10:12]: (error) The address of variable 's.a' is accessed at non-zero index. [objectIndex]\n", + errout_str()); } void checkPipeParameterSize() { // #3521