diff options
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, "&"); |
