Skip to content

Commit ab3614b

Browse files
committed
Bug hunting; Improved debug output for structs
1 parent da1375c commit ab3614b

2 files changed

Lines changed: 19 additions & 8 deletions

File tree

lib/exprengine.cpp

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ namespace {
159159

160160
static 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
}

lib/exprengine.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,10 @@ namespace ExprEngine {
240240

241241
std::string getSymbolicExpression() const OVERRIDE;
242242

243+
std::string getRange() const OVERRIDE {
244+
return getSymbolicExpression();
245+
}
246+
243247
ValuePtr getValueOfMember(const std::string &n) const {
244248
auto it = member.find(n);
245249
return (it == member.end()) ? ValuePtr() : it->second;

0 commit comments

Comments
 (0)