From db7506ab8288cdbf0a47c40e654c7e8d1a6d0757 Mon Sep 17 00:00:00 2001 From: Mason Reed Date: Mon, 10 Nov 2025 13:53:11 -0500 Subject: Fix crash for psuedo views (C/Obj-C/Rust) with unknown array access expr type Fixes https://github.com/Vector35/binaryninja-api/issues/7603 --- lang/rust/pseudorust.cpp | 47 +++++++++++++++++++++++++++++++---------------- 1 file changed, 31 insertions(+), 16 deletions(-) (limited to 'lang/rust/pseudorust.cpp') 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(); - if (arrayIndexExpr.operation == HLIL_VAR - && arrayIndexExpr.GetType()->GetChildType()->GetWidth() < instr.size) - { - if (!addrOf) + if (arrayIndexExpr.operation == HLIL_VAR) + { + const Variable var = arrayIndexExpr.GetVariable(); + // 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(); + // 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, "&"); -- cgit v1.3.1