diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 434c25585..4dece21cd 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -2412,7 +2412,7 @@ bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Setti // If const is applied to the pointer, then the value can still be modified if (Token::simpleMatch(arg->typeEndToken(), "* const")) return true; - if (!arg->isPointer() && (!arg->valueType() || arg->valueType()->type == ValueType::UNKNOWN_TYPE)) + if (arg->isArray() || (!arg->isPointer() && (!arg->valueType() || arg->valueType()->type == ValueType::UNKNOWN_TYPE))) return true; } if (!arg->isConst() && arg->isReference()) diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 5066b6516..7813a0171 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -5416,6 +5416,19 @@ private: " }\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + // #11624 + valueFlowUninit("const int N = 2;\n" + "void g(int a[N]) {\n" + " for (int i = 0; i < N; ++i)\n" + " a[i] = 1;\n" + "}\n" + "void f() {\n" + " int a[N];\n" + " g(a);\n" + " if (a[0]) {}\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void valueFlowUninitBreak() { // Do not show duplicate warnings about the same uninitialized value