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/c/pseudoc.cpp | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) (limited to 'lang/c/pseudoc.cpp') 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(); - 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(); + 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(); + // 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