diff --git a/lang/c/pseudoc.cpp b/lang/c/pseudoc.cpp index 4362ec40d..7bd764472 100644 --- a/lang/c/pseudoc.cpp +++ b/lang/c/pseudoc.cpp @@ -2464,7 +2464,7 @@ void PseudoCFunction::GetExprTextInternal(const HighLevelILInstruction& instr, H if (type && (type->GetClass() == NamedTypeReferenceClass)) type = GetFunction()->GetView()->GetTypeByRef(type->GetNamedTypeReference()); - bool derefOffset = false; + bool memberResolved = false; if (type && (type->GetClass() == StructureTypeClass)) { std::optional memberIndexHint; @@ -2472,84 +2472,77 @@ void PseudoCFunction::GetExprTextInternal(const HighLevelILInstruction& instr, H memberIndexHint = memberIndex; bool outer = true; - if (type->GetStructure()->ResolveMemberOrBaseMember(GetFunction()->GetView(), offset, 0, - [&](NamedTypeReference*, Structure* s, size_t memberIndex, uint64_t structOffset, - uint64_t adjustedOffset, const StructureMember& member) { - BNSymbolDisplayResult symbolType; - if (srcExpr.operation == HLIL_CONST_PTR) - { - const auto constant = srcExpr.GetConstant(); - symbolType = tokens.AppendPointerTextToken( - srcExpr, constant, settings, DisplaySymbolOnly, precedence); - } - else - { - GetExprTextInternal(srcExpr, tokens, settings, MemberAndFunctionOperatorPrecedence); - symbolType = OtherSymbolResult; - } - - const auto displayDeref = symbolType != DataSymbolResult; - if (displayDeref && outer) - tokens.Append(OperationToken, "->"); - else - tokens.Append(OperationToken, "."); - outer = false; - - vector nameList {member.name}; - HighLevelILTokenEmitter::AddNamesForOuterStructureMembers( - GetFunction()->GetView(), type, srcExpr, nameList); - - tokens.Append(FieldNameToken, member.name, structOffset + member.offset, 0, 0, - BN_FULL_CONFIDENCE, nameList); - }), - memberIndexHint) + memberResolved = type->GetStructure()->ResolveMemberOrBaseMember(GetFunction()->GetView(), offset, 0, + [&](NamedTypeReference*, Structure* s, size_t memberIndex, uint64_t structOffset, + uint64_t adjustedOffset, const StructureMember& member) { + BNSymbolDisplayResult symbolType; + if (srcExpr.operation == HLIL_CONST_PTR) + { + const auto constant = srcExpr.GetConstant(); + symbolType = tokens.AppendPointerTextToken( + srcExpr, constant, settings, DisplaySymbolOnly, precedence); + } + else + { + GetExprTextInternal(srcExpr, tokens, settings, MemberAndFunctionOperatorPrecedence); + symbolType = OtherSymbolResult; + } + + const auto displayDeref = symbolType != DataSymbolResult; + if (displayDeref && outer) + tokens.Append(OperationToken, "->"); + else + tokens.Append(OperationToken, "."); + outer = false; + + vector nameList {member.name}; + HighLevelILTokenEmitter::AddNamesForOuterStructureMembers( + GetFunction()->GetView(), type, srcExpr, nameList); + + tokens.Append(FieldNameToken, member.name, structOffset + member.offset, 0, 0, + BN_FULL_CONFIDENCE, nameList); + }, + memberIndexHint); + + if (memberResolved) return; } - else if (type && (type->GetClass() == StructureTypeClass)) - { - derefOffset = true; - } - if (derefOffset || offset != 0) - { - bool parens = precedence > UnaryOperatorPrecedence; - if (parens) - tokens.AppendOpenParen(); + // Fall through to handle as pointer arithmetic + bool parens = precedence > UnaryOperatorPrecedence; + if (parens) + tokens.AppendOpenParen(); - tokens.Append(OperationToken, "*"); - if (!settings || settings->IsOptionSet(ShowTypeCasts)) - { - tokens.AppendOpenParen(); - AppendSizeToken(!derefOffset ? srcExpr.size : instr.size, true, tokens); - tokens.Append(TextToken, "*"); - tokens.AppendCloseParen(); - } + tokens.Append(OperationToken, "*"); + if (!settings || settings->IsOptionSet(ShowTypeCasts)) + { tokens.AppendOpenParen(); - if (!settings || settings->IsOptionSet(ShowTypeCasts)) - { - tokens.AppendOpenParen(); - tokens.Append(TypeNameToken, "char"); - tokens.Append(TextToken, "*"); - tokens.AppendCloseParen(); - } + AppendSizeToken(instr.size, true, tokens); + tokens.Append(TextToken, "*"); + tokens.AppendCloseParen(); + } + tokens.AppendOpenParen(); - if (srcExpr.operation == HLIL_CONST_PTR) - { - const auto constant = srcExpr.GetConstant(); - tokens.AppendPointerTextToken(srcExpr, constant, settings, DisplaySymbolOnly, precedence); - } - else - { - GetExprTextInternal(srcExpr, tokens, settings, AddOperatorPrecedence); - } + if (srcExpr.operation == HLIL_CONST_PTR) + { + const auto constant = srcExpr.GetConstant(); + tokens.AppendPointerTextToken(srcExpr, constant, settings, DisplaySymbolOnly, precedence); + } + else + { + GetExprTextInternal(srcExpr, tokens, settings, AddOperatorPrecedence); + } + if (offset != 0) + { tokens.Append(OperationToken, " + "); tokens.AppendIntegerTextToken(instr, offset, instr.size); - tokens.AppendCloseParen(); - if (parens) - tokens.AppendCloseParen(); } + tokens.AppendCloseParen(); + if (parens) + tokens.AppendCloseParen(); + if (statement) tokens.AppendSemicolon(); }();