summaryrefslogtreecommitdiff
path: root/lang
diff options
context:
space:
mode:
authorBrandon Miller <brandon@vector35.com>2025-05-06 13:48:31 -0400
committerBrandon Miller <brandon@vector35.com>2025-05-06 13:48:31 -0400
commit9bd77eca3d5a0fea7b57af6252d85ab4ce4c506d (patch)
tree3976e0328dd8f845251bbe2444ad4d7a81983bda /lang
parenta90cbb9ff5195b8ccc354610c17d892e84024fe5 (diff)
Add cast to partial var accesses in pseudo C/Rust
Add casts to HLIL_STRUCT_FIELD expressions where the size of the source expression is greater than the size of access
Diffstat (limited to 'lang')
-rw-r--r--lang/c/pseudoc.cpp9
-rw-r--r--lang/rust/pseudorust.cpp10
2 files changed, 19 insertions, 0 deletions
diff --git a/lang/c/pseudoc.cpp b/lang/c/pseudoc.cpp
index b91b8e71..296c2d6a 100644
--- a/lang/c/pseudoc.cpp
+++ b/lang/c/pseudoc.cpp
@@ -1618,6 +1618,15 @@ void PseudoCFunction::GetExprTextInternal(const HighLevelILInstruction& instr, H
tokens.Append(OperationToken, "&");
}
}
+ else if ((!settings || settings->IsOptionSet(ShowTypeCasts)) && srcExpr.operation == HLIL_VAR)
+ {
+ if (srcExpr.GetType() && srcExpr.GetType()->GetClass() != StructureTypeClass && srcExpr.size > instr.size)
+ {
+ tokens.AppendOpenParen();
+ AppendSizeToken(instr.size, false, tokens);
+ tokens.AppendCloseParen();
+ }
+ }
GetExprTextInternal(srcExpr, tokens, settings, MemberAndFunctionOperatorPrecedence);
}
diff --git a/lang/rust/pseudorust.cpp b/lang/rust/pseudorust.cpp
index 80858658..380be7c6 100644
--- a/lang/rust/pseudorust.cpp
+++ b/lang/rust/pseudorust.cpp
@@ -1689,6 +1689,16 @@ void PseudoRustFunction::GetExprText(const HighLevelILInstruction& instr, HighLe
castedSrcExpr = true;
}
}
+ else if ((!settings || settings->IsOptionSet(ShowTypeCasts)) && srcExpr.operation == HLIL_VAR)
+ {
+ if (srcExpr.GetType() && srcExpr.GetType()->GetClass() != StructureTypeClass && srcExpr.size > instr.size)
+ {
+ GetExprText(srcExpr, tokens, settings, MemberAndFunctionOperatorPrecedence);
+ tokens.Append(KeywordToken, " as ");
+ AppendSizeToken(instr.size, false, tokens);
+ castedSrcExpr = true;
+ }
+ }
if (!castedSrcExpr)
GetExprText(srcExpr, tokens, settings, MemberAndFunctionOperatorPrecedence);