@@ -159,7 +159,7 @@ namespace {
159159
160160static std::string str (ExprEngine::ValuePtr val)
161161{
162- const char *typestr;
162+ const char *typestr = " ???UnknownValueType??? " ;
163163 switch (val->type ) {
164164 case ExprEngine::ValueType::AddressOfValue:
165165 typestr = " AddressOfValue" ;
@@ -1050,8 +1050,15 @@ std::string ExprEngine::ArrayValue::getSymbolicExpression() const
10501050 for (const auto &indexAndValue : data) {
10511051 ostr << " ,["
10521052 << (!indexAndValue.index ? std::string (" :" ) : indexAndValue.index ->name )
1053- << " ]="
1054- << indexAndValue.value ->name ;
1053+ << " ]=" ;
1054+ if (indexAndValue.value ->type == ExprEngine::ValueType::StructValue)
1055+ ostr << " ("
1056+ << indexAndValue.value ->name
1057+ << " ,"
1058+ << indexAndValue.value ->getSymbolicExpression ()
1059+ << " )" ;
1060+ else
1061+ ostr << indexAndValue.value ->name ;
10551062 }
10561063 return ostr.str ();
10571064}
@@ -2717,7 +2724,7 @@ void ExprEngine::executeAllFunctions(ErrorLogger *errorLogger, const Tokenizer *
27172724 }
27182725}
27192726
2720- static ExprEngine::ValuePtr createStructVal (const Scope *structScope, bool uninitData, Data &data)
2727+ static ExprEngine::ValuePtr createStructVal (const Token *tok, const Scope *structScope, bool uninitData, Data &data)
27212728{
27222729 if (!structScope)
27232730 return ExprEngine::ValuePtr ();
@@ -2737,7 +2744,7 @@ static ExprEngine::ValuePtr createStructVal(const Scope *structScope, bool unini
27372744 if (member.valueType () && member.valueType ()->isIntegral ()) {
27382745 ExprEngine::ValuePtr memberValue = createVariableValue (member, data);
27392746 if (memberValue)
2740- structValue-> member [member .name ()] = memberValue;
2747+ data. assignStructMember (tok, structValue. get (), member.name (), memberValue) ;
27412748 }
27422749 }
27432750 return structValue;
@@ -2763,7 +2770,7 @@ static ExprEngine::ValuePtr createVariableValue(const Variable &var, Data &data)
27632770 auto bufferSize = std::make_shared<ExprEngine::IntRange>(data.getNewSymbolName (), 1 , ~0UL );
27642771 ExprEngine::ValuePtr pointerValue;
27652772 if (valueType->type == ValueType::Type::RECORD)
2766- pointerValue = createStructVal (valueType->typeScope , var.isLocal () && !var.isStatic (), data);
2773+ pointerValue = createStructVal (var. nameToken (), valueType->typeScope , var.isLocal () && !var.isStatic (), data);
27672774 else {
27682775 ValueType vt (*valueType);
27692776 vt.pointer = 0 ;
@@ -2794,10 +2801,10 @@ static ExprEngine::ValuePtr createVariableValue(const Variable &var, Data &data)
27942801 }
27952802 if (var.isArgument () && var.isConst ())
27962803 uninitData = false ;
2797- return createStructVal (valueType->typeScope , uninitData, data);
2804+ return createStructVal (var. nameToken (), valueType->typeScope , uninitData, data);
27982805 }
27992806 if (valueType->smartPointerType ) {
2800- auto structValue = createStructVal (valueType->smartPointerType ->classScope , var.isLocal () && !var.isStatic (), data);
2807+ auto structValue = createStructVal (var. nameToken (), valueType->smartPointerType ->classScope , var.isLocal () && !var.isStatic (), data);
28012808 auto size = std::make_shared<ExprEngine::IntRange>(data.getNewSymbolName (), 1 , ~0UL );
28022809 return std::make_shared<ExprEngine::ArrayValue>(data.getNewSymbolName (), size, structValue, true , true , false );
28032810 }
0 commit comments