From 6fa0716c5701bc091a7b48aa3e259063f7ae3d5d Mon Sep 17 00:00:00 2001 From: Paul Fultz II Date: Tue, 10 Sep 2019 12:40:08 -0500 Subject: [PATCH] Fix issue 9348: FP uninitvar for pointer passed to memcpy (#2167) --- lib/astutils.cpp | 2 +- test/testuninitvar.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 5778dc215eb..65f6cb1f3eb 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -1051,7 +1051,7 @@ bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Setti argDirection == Library::ArgumentChecks::Direction::DIR_INOUT) { // With out or inout the direction of the content is specified, not a pointer itself, so ignore pointers for now const ValueType * const valueType = tok1->valueType(); - if (valueType && !valueType->pointer) { + if (valueType && valueType->pointer == indirect) { return true; } } diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 0918825980c..3bdeda298d3 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -4448,6 +4448,17 @@ class TestUninitVar : public TestFixture { " return;\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + // # 9348 + valueFlowUninit("void f(int *a) {\n" + " int b = 0;\n" + " memcpy(a, &b, sizeof(b));\n" + "}\n" + "void g() {\n" + " int i;\n" + " f(&i);\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void uninitvar_memberfunction() {