Skip to content

Commit 2948afb

Browse files
committed
Fixes binaryninja-api#6825 we weren't handling zero offsets from structures at all it looks like.
1 parent 8ef932b commit 2948afb

File tree

1 file changed

+61
-68
lines changed

1 file changed

+61
-68
lines changed

lang/c/pseudoc.cpp

Lines changed: 61 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -2464,92 +2464,85 @@ void PseudoCFunction::GetExprTextInternal(const HighLevelILInstruction& instr, H
24642464
if (type && (type->GetClass() == NamedTypeReferenceClass))
24652465
type = GetFunction()->GetView()->GetTypeByRef(type->GetNamedTypeReference());
24662466

2467-
bool derefOffset = false;
2467+
bool memberResolved = false;
24682468
if (type && (type->GetClass() == StructureTypeClass))
24692469
{
24702470
std::optional<size_t> memberIndexHint;
24712471
if (memberIndex != BN_INVALID_EXPR)
24722472
memberIndexHint = memberIndex;
24732473

24742474
bool outer = true;
2475-
if (type->GetStructure()->ResolveMemberOrBaseMember(GetFunction()->GetView(), offset, 0,
2476-
[&](NamedTypeReference*, Structure* s, size_t memberIndex, uint64_t structOffset,
2477-
uint64_t adjustedOffset, const StructureMember& member) {
2478-
BNSymbolDisplayResult symbolType;
2479-
if (srcExpr.operation == HLIL_CONST_PTR)
2480-
{
2481-
const auto constant = srcExpr.GetConstant<HLIL_CONST_PTR>();
2482-
symbolType = tokens.AppendPointerTextToken(
2483-
srcExpr, constant, settings, DisplaySymbolOnly, precedence);
2484-
}
2485-
else
2486-
{
2487-
GetExprTextInternal(srcExpr, tokens, settings, MemberAndFunctionOperatorPrecedence);
2488-
symbolType = OtherSymbolResult;
2489-
}
2490-
2491-
const auto displayDeref = symbolType != DataSymbolResult;
2492-
if (displayDeref && outer)
2493-
tokens.Append(OperationToken, "->");
2494-
else
2495-
tokens.Append(OperationToken, ".");
2496-
outer = false;
2497-
2498-
vector<string> nameList {member.name};
2499-
HighLevelILTokenEmitter::AddNamesForOuterStructureMembers(
2500-
GetFunction()->GetView(), type, srcExpr, nameList);
2501-
2502-
tokens.Append(FieldNameToken, member.name, structOffset + member.offset, 0, 0,
2503-
BN_FULL_CONFIDENCE, nameList);
2504-
}),
2505-
memberIndexHint)
2475+
memberResolved = type->GetStructure()->ResolveMemberOrBaseMember(GetFunction()->GetView(), offset, 0,
2476+
[&](NamedTypeReference*, Structure* s, size_t memberIndex, uint64_t structOffset,
2477+
uint64_t adjustedOffset, const StructureMember& member) {
2478+
BNSymbolDisplayResult symbolType;
2479+
if (srcExpr.operation == HLIL_CONST_PTR)
2480+
{
2481+
const auto constant = srcExpr.GetConstant<HLIL_CONST_PTR>();
2482+
symbolType = tokens.AppendPointerTextToken(
2483+
srcExpr, constant, settings, DisplaySymbolOnly, precedence);
2484+
}
2485+
else
2486+
{
2487+
GetExprTextInternal(srcExpr, tokens, settings, MemberAndFunctionOperatorPrecedence);
2488+
symbolType = OtherSymbolResult;
2489+
}
2490+
2491+
const auto displayDeref = symbolType != DataSymbolResult;
2492+
if (displayDeref && outer)
2493+
tokens.Append(OperationToken, "->");
2494+
else
2495+
tokens.Append(OperationToken, ".");
2496+
outer = false;
2497+
2498+
vector<string> nameList {member.name};
2499+
HighLevelILTokenEmitter::AddNamesForOuterStructureMembers(
2500+
GetFunction()->GetView(), type, srcExpr, nameList);
2501+
2502+
tokens.Append(FieldNameToken, member.name, structOffset + member.offset, 0, 0,
2503+
BN_FULL_CONFIDENCE, nameList);
2504+
},
2505+
memberIndexHint);
2506+
2507+
if (memberResolved)
25062508
return;
25072509
}
2508-
else if (type && (type->GetClass() == StructureTypeClass))
2509-
{
2510-
derefOffset = true;
2511-
}
25122510

2513-
if (derefOffset || offset != 0)
2514-
{
2515-
bool parens = precedence > UnaryOperatorPrecedence;
2516-
if (parens)
2517-
tokens.AppendOpenParen();
2511+
// Fall through to handle as pointer arithmetic
2512+
bool parens = precedence > UnaryOperatorPrecedence;
2513+
if (parens)
2514+
tokens.AppendOpenParen();
25182515

2519-
tokens.Append(OperationToken, "*");
2520-
if (!settings || settings->IsOptionSet(ShowTypeCasts))
2521-
{
2522-
tokens.AppendOpenParen();
2523-
AppendSizeToken(!derefOffset ? srcExpr.size : instr.size, true, tokens);
2524-
tokens.Append(TextToken, "*");
2525-
tokens.AppendCloseParen();
2526-
}
2516+
tokens.Append(OperationToken, "*");
2517+
if (!settings || settings->IsOptionSet(ShowTypeCasts))
2518+
{
25272519
tokens.AppendOpenParen();
2528-
if (!settings || settings->IsOptionSet(ShowTypeCasts))
2529-
{
2530-
tokens.AppendOpenParen();
2531-
tokens.Append(TypeNameToken, "char");
2532-
tokens.Append(TextToken, "*");
2533-
tokens.AppendCloseParen();
2534-
}
2520+
AppendSizeToken(instr.size, true, tokens);
2521+
tokens.Append(TextToken, "*");
2522+
tokens.AppendCloseParen();
2523+
}
2524+
tokens.AppendOpenParen();
25352525

2536-
if (srcExpr.operation == HLIL_CONST_PTR)
2537-
{
2538-
const auto constant = srcExpr.GetConstant<HLIL_CONST_PTR>();
2539-
tokens.AppendPointerTextToken(srcExpr, constant, settings, DisplaySymbolOnly, precedence);
2540-
}
2541-
else
2542-
{
2543-
GetExprTextInternal(srcExpr, tokens, settings, AddOperatorPrecedence);
2544-
}
2526+
if (srcExpr.operation == HLIL_CONST_PTR)
2527+
{
2528+
const auto constant = srcExpr.GetConstant<HLIL_CONST_PTR>();
2529+
tokens.AppendPointerTextToken(srcExpr, constant, settings, DisplaySymbolOnly, precedence);
2530+
}
2531+
else
2532+
{
2533+
GetExprTextInternal(srcExpr, tokens, settings, AddOperatorPrecedence);
2534+
}
25452535

2536+
if (offset != 0)
2537+
{
25462538
tokens.Append(OperationToken, " + ");
25472539
tokens.AppendIntegerTextToken(instr, offset, instr.size);
2548-
tokens.AppendCloseParen();
2549-
if (parens)
2550-
tokens.AppendCloseParen();
25512540
}
25522541

2542+
tokens.AppendCloseParen();
2543+
if (parens)
2544+
tokens.AppendCloseParen();
2545+
25532546
if (statement)
25542547
tokens.AppendSemicolon();
25552548
}();

0 commit comments

Comments
 (0)