diff --git a/lib/exprengine.cpp b/lib/exprengine.cpp index d8766deb9..f97cfc191 100644 --- a/lib/exprengine.cpp +++ b/lib/exprengine.cpp @@ -461,8 +461,16 @@ static ExprEngine::ValuePtr executeAssign(const Token *tok, Data &data) static ExprEngine::ValuePtr executeFunctionCall(const Token *tok, Data &data) { - for (const Token *argtok : getArguments(tok)) - (void)executeExpression(argtok, data); + for (const Token *argtok : getArguments(tok)) { + auto val = executeExpression(argtok, data); + if (auto arrayValue = std::dynamic_pointer_cast(val)) { + ValueType vt(*argtok->valueType()); + vt.pointer = 0; + auto anyVal = getValueRangeFromValueType(data.getNewSymbolName(), &vt, *data.settings); + for (int i = 0; i < arrayValue->data.size(); ++i) + arrayValue->data[i] = anyVal; + } + } auto val = getValueRangeFromValueType(data.getNewSymbolName(), tok->valueType(), *data.settings); call(data.callbacks, tok, val); return val; @@ -669,6 +677,9 @@ void ExprEngine::executeFunction(const Scope *functionScope, const Tokenizer *to const Function *function = functionScope->function; if (!function) return; + if (functionScope->bodyStart->fileIndex() > 0) + // TODO.. what about functions in headers? + return; int symbolValueIndex = 0; TrackExecution trackExecution; diff --git a/test/testexprengine.cpp b/test/testexprengine.cpp index 5c1827f43..33ae0ab91 100644 --- a/test/testexprengine.cpp +++ b/test/testexprengine.cpp @@ -50,6 +50,7 @@ private: TEST_CASE(localArray1); TEST_CASE(localArray2); + TEST_CASE(localArray3); TEST_CASE(localArrayUninit); TEST_CASE(pointerAlias1); @@ -145,6 +146,10 @@ private: ASSERT_EQUALS("0", getRange("inf f() { char arr[10] = \"\"; return arr[4]; }", "arr[4]")); } + void localArray3() { + ASSERT_EQUALS("0:255", getRange("int f() { unsigned char arr[10] = \"\"; dostuff(arr); return arr[4]; }", "arr[4]")); + } + void localArrayUninit() { ASSERT_EQUALS("?", getRange("inf f() { int arr[10]; return arr[4]; }", "arr[4]")); }