summaryrefslogtreecommitdiff
path: root/lang/c
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2025-04-14 12:43:50 -0400
committerBrandon Miller <brandon@vector35.com>2025-04-15 15:10:16 -0400
commita6f64bf19f966f5ecbaab0a9eff85ecbaa573317 (patch)
tree99a688ee5533527112f66e6f80933b00e5714724 /lang/c
parent13445bad31b60db063d454fefa6d6697889f428d (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.cpp40
-rw-r--r--lang/c/pseudoc.h2
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,