summaryrefslogtreecommitdiff
path: root/lang
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-11-10 13:53:11 -0500
committerMason Reed <35282038+emesare@users.noreply.github.com>2025-11-10 18:38:38 -0500
commitdb7506ab8288cdbf0a47c40e654c7e8d1a6d0757 (patch)
treedc552c3a90b2e1a6d2b8d10fa9b368732c0326b5 /lang
parent457928217ef7c2ea36aa20346df4e0790044ae35 (diff)
Fix crash for psuedo views (C/Obj-C/Rust) with unknown array access expr type
Fixes https://github.com/Vector35/binaryninja-api/issues/7603
Diffstat (limited to 'lang')
-rw-r--r--lang/c/pseudoc.cpp35
-rw-r--r--lang/rust/pseudorust.cpp45
2 files changed, 55 insertions, 25 deletions
diff --git a/lang/c/pseudoc.cpp b/lang/c/pseudoc.cpp
index a657fb71..48763804 100644
--- a/lang/c/pseudoc.cpp
+++ b/lang/c/pseudoc.cpp
@@ -592,16 +592,27 @@ void PseudoCFunction::AppendFieldTextTokens(const HighLevelILInstruction& instr,
if ((!settings || settings->IsOptionSet(ShowTypeCasts)) && srcExpr.operation == HLIL_ARRAY_INDEX)
{
auto arrayIndexExpr = srcExpr.GetSourceExpr<HLIL_ARRAY_INDEX>();
- if (arrayIndexExpr.operation == HLIL_VAR
- && arrayIndexExpr.GetType()->GetChildType()->GetWidth() < instr.size)
+ if (arrayIndexExpr.operation == HLIL_VAR)
{
- if (!addrOf)
+ const Variable var = arrayIndexExpr.GetVariable<HLIL_VAR>();
+ // NOTE: Querying through the variable type instead of expr type because it seems to be missing.
+ auto varTy = GetFunction()->GetVariableType(var).GetValue();
+ if (varTy && varTy->IsNamedTypeRefer())
+ varTy = varTy->DerefNamedTypeReference(GetFunction()->GetView());
+ if (varTy && varTy->GetChildType().GetValue() && varTy->GetChildType()->GetWidth() < instr.size)
+ {
+ if (!addrOf)
+ tokens.Append(TextToken, "*");
+ tokens.AppendOpenParen();
+ AppendSizeToken(instr.size, signedHint.value_or(false), tokens);
tokens.Append(TextToken, "*");
- tokens.AppendOpenParen();
- AppendSizeToken(instr.size, signedHint.value_or(false), tokens);
- tokens.Append(TextToken, "*");
- tokens.AppendCloseParen();
- tokens.Append(OperationToken, "&");
+ tokens.AppendCloseParen();
+ tokens.Append(OperationToken, "&");
+ }
+ else if (addrOf)
+ {
+ tokens.Append(OperationToken, "&");
+ }
}
else if (addrOf)
{
@@ -610,8 +621,12 @@ void PseudoCFunction::AppendFieldTextTokens(const HighLevelILInstruction& instr,
}
else if ((!settings || settings->IsOptionSet(ShowTypeCasts)) && srcExpr.operation == HLIL_VAR)
{
- if (srcExpr.GetType().GetValue() && srcExpr.GetType()->GetClass() != StructureTypeClass
- && srcExpr.size > instr.size)
+ const Variable var = srcExpr.GetVariable<HLIL_VAR>();
+ // NOTE: Querying through the variable type instead of expr type because it seems to be missing.
+ auto varTy = GetFunction()->GetVariableType(var).GetValue();
+ if (varTy && varTy->IsNamedTypeRefer())
+ varTy = varTy->DerefNamedTypeReference(GetFunction()->GetView());
+ if (varTy && varTy->GetClass() != StructureTypeClass && srcExpr.size > instr.size)
{
if (addrOf)
tokens.Append(OperationToken, "&");
diff --git a/lang/rust/pseudorust.cpp b/lang/rust/pseudorust.cpp
index 4b8f645b..b7082e77 100644
--- a/lang/rust/pseudorust.cpp
+++ b/lang/rust/pseudorust.cpp
@@ -551,21 +551,32 @@ void PseudoRustFunction::AppendFieldTextTokens(const HighLevelILInstruction& ins
if ((!settings || settings->IsOptionSet(ShowTypeCasts)) && srcExpr.operation == HLIL_ARRAY_INDEX)
{
auto arrayIndexExpr = srcExpr.GetSourceExpr<HLIL_ARRAY_INDEX>();
- if (arrayIndexExpr.operation == HLIL_VAR
- && arrayIndexExpr.GetType()->GetChildType()->GetWidth() < instr.size)
+ if (arrayIndexExpr.operation == HLIL_VAR)
{
- if (!addrOf)
+ const Variable var = arrayIndexExpr.GetVariable<HLIL_VAR>();
+ // NOTE: Querying through the variable type instead of expr type because it seems to be missing.
+ auto varTy = GetFunction()->GetVariableType(var).GetValue();
+ if (varTy && varTy->IsNamedTypeRefer())
+ varTy = varTy->DerefNamedTypeReference(GetFunction()->GetView());
+ if (varTy && varTy->GetChildType().GetValue() && varTy->GetChildType()->GetWidth() < instr.size)
+ {
+ if (!addrOf)
+ tokens.Append(TextToken, "*");
+ tokens.AppendOpenParen();
+ tokens.Append(OperationToken, "&");
+ GetExprText(srcExpr, tokens, settings, UnaryOperatorPrecedence);
+ tokens.Append(KeywordToken, " as ");
tokens.Append(TextToken, "*");
- tokens.AppendOpenParen();
- tokens.Append(OperationToken, "&");
- GetExprText(srcExpr, tokens, settings, UnaryOperatorPrecedence);
- tokens.Append(KeywordToken, " as ");
- tokens.Append(TextToken, "*");
- tokens.Append(KeywordToken, "mut ");
- AppendSizeToken(instr.size, signedHint.value_or(false), tokens);
- tokens.AppendCloseParen();
- castedSrcExpr = true;
- precedence = MemberAndFunctionOperatorPrecedence;
+ tokens.Append(KeywordToken, "mut ");
+ AppendSizeToken(instr.size, signedHint.value_or(false), tokens);
+ tokens.AppendCloseParen();
+ castedSrcExpr = true;
+ precedence = MemberAndFunctionOperatorPrecedence;
+ }
+ else if (addrOf)
+ {
+ tokens.Append(OperationToken, "&");
+ }
}
else if (addrOf)
{
@@ -574,8 +585,12 @@ void PseudoRustFunction::AppendFieldTextTokens(const HighLevelILInstruction& ins
}
else if ((!settings || settings->IsOptionSet(ShowTypeCasts)) && srcExpr.operation == HLIL_VAR)
{
- if (srcExpr.GetType().GetValue() && srcExpr.GetType()->GetClass() != StructureTypeClass
- && srcExpr.size > instr.size)
+ const Variable var = srcExpr.GetVariable<HLIL_VAR>();
+ // NOTE: Querying through the variable type instead of expr type because it seems to be missing.
+ auto varTy = GetFunction()->GetVariableType(var).GetValue();
+ if (varTy && varTy->IsNamedTypeRefer())
+ varTy = varTy->DerefNamedTypeReference(GetFunction()->GetView());
+ if (varTy && varTy->GetClass() != StructureTypeClass && srcExpr.size > instr.size)
{
if (addrOf)
tokens.Append(OperationToken, "&");