From c8003d47e2a530558ad51a42b9b9e30dfcad9363 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 8 Mar 2019 18:42:24 +0100 Subject: [PATCH] checkuninitvar.cpp: Use argument direction "out" info from library cfg (#1730) CheckUninitVar::isMemberVariableAssignment uses argument direction "out" now also to check for assignment when the member variable is handed over to a function by reference. testuninitvar.cpp: Improve tests, use a test library configuration. --- lib/checkuninitvar.cpp | 2 ++ test/testuninitvar.cpp | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index a16bed5c2..b29ae887a 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1205,6 +1205,8 @@ bool CheckUninitVar::isMemberVariableAssignment(const Token *tok, const std::str const Library::ArgumentChecks::Direction argDirection = mSettings->library.getArgDirection(ftok, 1 + argumentNumber); if (argDirection == Library::ArgumentChecks::Direction::DIR_IN) return false; + else if (argDirection == Library::ArgumentChecks::Direction::DIR_OUT) + return true; } const Variable *arg = function ? function->getArgumentVar(argumentNumber) : nullptr; diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 95f568c93..6f07ae542 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -3175,6 +3175,36 @@ private: "}\n", "test.c"); ASSERT_EQUALS("", errout.str()); + { + const char argDirectionsTestXmlData[] = "\n" + "\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + ""; + + ASSERT_EQUALS(true, settings.library.loadxmldata(argDirectionsTestXmlData, sizeof(argDirectionsTestXmlData) / sizeof(argDirectionsTestXmlData[0]))); + + checkUninitVar("struct AB { int a; };\n" + "void f(void) {\n" + " struct AB ab;\n" + " uninitvar_funcArgInTest(&ab);\n" + " x = ab;\n" + "}\n", "test.c"); + ASSERT_EQUALS("[test.c:5]: (error) Uninitialized struct member: ab.a\n", errout.str()); + + checkUninitVar("struct AB { int a; };\n" + "void f(void) {\n" + " struct AB ab;\n" + " uninitvar_funcArgOutTest(&ab);\n" + " x = ab;\n" + "}\n", "test.c"); + ASSERT_EQUALS("", errout.str()); + } + checkUninitVar("struct AB { int a; int b; };\n" "void do_something(const struct AB ab);\n" "void f(void) {\n"