diff options
| author | Brandon Miller <brandon@vector35.com> | 2025-04-14 12:43:50 -0400 |
|---|---|---|
| committer | Brandon Miller <brandon@vector35.com> | 2025-04-15 15:10:16 -0400 |
| commit | a6f64bf19f966f5ecbaab0a9eff85ecbaa573317 (patch) | |
| tree | 99a688ee5533527112f66e6f80933b00e5714724 /lang/c | |
| parent | 13445bad31b60db063d454fefa6d6697889f428d (diff) | |
Fix pseudo C/Rust absent lhs on comparison
This issue was caused because HLIL_SPLIT was not being handled on the
left and right expressions of HLIL_IF instructions
Diffstat (limited to 'lang/c')
| -rw-r--r-- | lang/c/pseudoc.cpp | 40 | ||||
| -rw-r--r-- | lang/c/pseudoc.h | 2 |
2 files changed, 30 insertions, 12 deletions
diff --git a/lang/c/pseudoc.cpp b/lang/c/pseudoc.cpp index 55a3c2c1..8ab07a75 100644 --- a/lang/c/pseudoc.cpp +++ b/lang/c/pseudoc.cpp @@ -235,9 +235,15 @@ void PseudoCFunction::AppendComparison(const string& comparison, const HighLevel const auto leftExpr = instr.GetLeftExpr(); const auto rightExpr = instr.GetRightExpr(); - GetExprTextInternal(leftExpr, emitter, settings, precedence, false, signedHint); + if (leftExpr.operation == HLIL_SPLIT) + AppendDefaultSplitExpr(leftExpr, emitter, settings, precedence); + else + GetExprTextInternal(leftExpr, emitter, settings, precedence, false, signedHint); emitter.Append(OperationToken, comparison); - GetExprTextInternal(rightExpr, emitter, settings, precedence, false, signedHint); + if (rightExpr.operation == HLIL_SPLIT) + AppendDefaultSplitExpr(rightExpr, emitter, settings, precedence); + else + GetExprTextInternal(rightExpr, emitter, settings, precedence, false, signedHint); } @@ -436,6 +442,25 @@ PseudoCFunction::FieldDisplayType PseudoCFunction::GetFieldDisplayType( } +void PseudoCFunction::AppendDefaultSplitExpr(const BinaryNinja::HighLevelILInstruction& instr, + BinaryNinja::HighLevelILTokenEmitter& tokens, DisassemblySettings* settings, BNOperatorPrecedence precedence) +{ + const auto high = instr.GetHighExpr<HLIL_SPLIT>(); + const auto low = instr.GetLowExpr<HLIL_SPLIT>(); + if (precedence == EqualityOperatorPrecedence) + tokens.AppendOpenParen(); + tokens.AppendOpenParen(); + GetExprTextInternal(high, tokens, settings, precedence); + tokens.Append(OperationToken, " << "); + tokens.Append(IntegerToken, std::to_string(low.size * 8)); + tokens.AppendCloseParen(); + tokens.Append(OperationToken, " | "); + GetExprTextInternal(low, tokens, settings, precedence); + if (precedence == EqualityOperatorPrecedence) + tokens.AppendCloseParen(); +} + + void PseudoCFunction::AppendFieldTextTokens(const HighLevelILInstruction& var, uint64_t offset, size_t memberIndex, size_t size, HighLevelILTokenEmitter& tokens, bool deref, bool displayDeref) { @@ -1330,19 +1355,10 @@ void PseudoCFunction::GetExprTextInternal(const HighLevelILInstruction& instr, H } else if (srcExpr.operation == HLIL_SPLIT) { - const auto high = srcExpr.GetHighExpr<HLIL_SPLIT>(); - const auto low = srcExpr.GetLowExpr<HLIL_SPLIT>(); GetExprTextInternal(destExpr, tokens, settings, precedence); tokens.Append(OperationToken, " = "); - tokens.AppendOpenParen(); - GetExprTextInternal(high, tokens, settings, precedence); - tokens.Append(OperationToken, " << "); - tokens.Append(IntegerToken, std::to_string(low.size * 8)); - tokens.AppendCloseParen(); - tokens.Append(OperationToken, " | "); - GetExprTextInternal(low, tokens, settings, precedence); + AppendDefaultSplitExpr(srcExpr, tokens, settings, precedence); tokens.AppendSemicolon(); - tokens.NewLine(); return; } else diff --git a/lang/c/pseudoc.h b/lang/c/pseudoc.h index feb64552..a3b03a88 100644 --- a/lang/c/pseudoc.h +++ b/lang/c/pseudoc.h @@ -35,6 +35,8 @@ class PseudoCFunction: public BinaryNinja::LanguageRepresentationFunction BinaryNinja::HighLevelILTokenEmitter& tokens, BinaryNinja::DisassemblySettings* settings); void AppendFieldTextTokens(const BinaryNinja::HighLevelILInstruction& var, uint64_t offset, size_t memberIndex, size_t size, BinaryNinja::HighLevelILTokenEmitter& tokens, bool deref, bool displayDeref = true); + void AppendDefaultSplitExpr(const BinaryNinja::HighLevelILInstruction& instr, BinaryNinja::HighLevelILTokenEmitter& tokens, + BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence); void GetExprTextInternal(const BinaryNinja::HighLevelILInstruction& instr, BinaryNinja::HighLevelILTokenEmitter& tokens, BinaryNinja::DisassemblySettings* settings, BNOperatorPrecedence precedence = TopLevelOperatorPrecedence, bool statement = false, |
