diff options
| author | Mason Reed <mason@vector35.com> | 2025-11-10 13:53:11 -0500 |
|---|---|---|
| committer | Mason Reed <35282038+emesare@users.noreply.github.com> | 2025-11-10 18:38:38 -0500 |
| commit | db7506ab8288cdbf0a47c40e654c7e8d1a6d0757 (patch) | |
| tree | dc552c3a90b2e1a6d2b8d10fa9b368732c0326b5 /lang/c/pseudoc.cpp | |
| parent | 457928217ef7c2ea36aa20346df4e0790044ae35 (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/c/pseudoc.cpp')
| -rw-r--r-- | lang/c/pseudoc.cpp | 35 |
1 files changed, 25 insertions, 10 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, "&"); |
