From 608e5a15228eade49f0926aab2ee45c7af8994e6 Mon Sep 17 00:00:00 2001 From: chrchr Date: Tue, 13 Sep 2022 11:06:01 +0200 Subject: [PATCH] Fix ValueFlow crash --- lib/valueflow.cpp | 6 ++++-- test/testvalueflow.cpp | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index ea11ce9cb32..73e295c9a0d 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -4818,8 +4818,10 @@ static void valueFlowAfterMove(TokenList* tokenlist, SymbolDatabase* symboldatab value.setKnown(); setTokenValue(tok, value, settings); - const Token * const endOfVarScope = var->scope()->bodyEnd; - valueFlowForward(tok->next(), endOfVarScope, tok, std::move(value), tokenlist); + if (var->scope()) { + const Token* const endOfVarScope = var->scope()->bodyEnd; + valueFlowForward(tok->next(), endOfVarScope, tok, std::move(value), tokenlist); + } continue; } ValueFlow::Value::MoveKind moveKind; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 5a5abacc3db..429b1fa993b 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -6789,6 +6789,15 @@ class TestValueFlow : public TestFixture { " for (b c : {b{}, {}}) {}\n" "}\n"; valueOfTok(code, "c"); + + code = "class T {\n" + "private slots:\n" + " void f() { D& r = dynamic_cast(*m); }\n" + " void g() { m.reset(new D); }\n" + "private:\n" + " std::shared_ptr m;\n" + "};\n"; + valueOfTok(code, "r"); } void valueFlowHang() {