From e904f7341e286e0dee1c27417afe61b429ac305a Mon Sep 17 00:00:00 2001 From: chrchr-github <78114321+chrchr-github@users.noreply.github.com> Date: Tue, 13 Sep 2022 12:25:15 +0200 Subject: [PATCH] Fix ValueFlow crash (#4461) --- 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 ea11ce9cb..73e295c9a 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 5a5abacc3..429b1fa99 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -6789,6 +6789,15 @@ private: " 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() {