Merge remote-tracking branch 'origin/GP-4972_PtrsubUndoInfiniteLoop'

into patch (Closes #6969)
This commit is contained in:
Ryan Kurtz 2024-10-01 08:36:13 -04:00
commit a3c0498920
2 changed files with 11 additions and 9 deletions

View File

@ -2729,7 +2729,7 @@ int4 ActionSetCasts::apply(Funcdata &data)
data.opUndoPtradd(op,true); data.opUndoPtradd(op,true);
} }
else if (opc == CPUI_PTRSUB) { // Check for PTRSUB that no longer fits pointer else if (opc == CPUI_PTRSUB) { // Check for PTRSUB that no longer fits pointer
if (!op->getIn(0)->getTypeReadFacing(op)->isPtrsubMatching(op->getIn(1)->getOffset(),0,1)) { if (!op->getIn(0)->getTypeReadFacing(op)->isPtrsubMatching(op->getIn(1)->getOffset(),0,0)) {
if (op->getIn(1)->getOffset() == 0) { if (op->getIn(1)->getOffset() == 0) {
data.opRemoveInput(op, 1); data.opRemoveInput(op, 1);
data.opSetOpcode(op, CPUI_COPY); data.opSetOpcode(op, CPUI_COPY);

View File

@ -6627,13 +6627,13 @@ void RulePtrsubUndo::getOpList(vector<uint4> &oplist) const
/// the sum of all the constants. Additionally pass back the biggest constant coefficient, for any term /// the sum of all the constants. Additionally pass back the biggest constant coefficient, for any term
/// formed with INT_MULT. /// formed with INT_MULT.
/// \param vn is the given root Varnode of the additive tree /// \param vn is the given root Varnode of the additive tree
/// \param multiplier will hold the biggest constant coefficient /// \param multiplier will hold the biggest constant multiplier or 0, if no multiplier is present
/// \param maxLevel is the maximum depth to search in the tree /// \param maxLevel is the maximum depth to search in the tree
/// \return the sum of all constants in the additive expression /// \return the sum of all constants in the additive expression
int8 RulePtrsubUndo::getConstOffsetBack(Varnode *vn,int8 &multiplier,int4 maxLevel) int8 RulePtrsubUndo::getConstOffsetBack(Varnode *vn,int8 &multiplier,int4 maxLevel)
{ {
multiplier = 1; multiplier = 0;
int8 submultiplier; int8 submultiplier;
if (vn->isConstant()) if (vn->isConstant())
return vn->getOffset(); return vn->getOffset();
@ -6658,7 +6658,8 @@ int8 RulePtrsubUndo::getConstOffsetBack(Varnode *vn,int8 &multiplier,int4 maxLev
if (!cvn->isConstant()) return 0; if (!cvn->isConstant()) return 0;
multiplier = cvn->getOffset(); multiplier = cvn->getOffset();
getConstOffsetBack(op->getIn(0), submultiplier, maxLevel); getConstOffsetBack(op->getIn(0), submultiplier, maxLevel);
multiplier *= submultiplier; // Only contribute to the multiplier if (submultiplier > 0)
multiplier *= submultiplier; // Only contribute to the multiplier
} }
return retval; return retval;
} }
@ -6669,12 +6670,12 @@ int8 RulePtrsubUndo::getConstOffsetBack(Varnode *vn,int8 &multiplier,int4 maxLev
/// constant value being added to the PTRSUB. Additionally pass back the biggest constant coefficient of any /// constant value being added to the PTRSUB. Additionally pass back the biggest constant coefficient of any
/// multiplicative term in the expression. /// multiplicative term in the expression.
/// \param op is the given PTRSUB /// \param op is the given PTRSUB
/// \param multiplier will hold the biggest multiplicative coefficient /// \param multiplier will hold the biggest multiplicative coefficient or 0, if no INT_MULT or PTRADD is present.
int8 RulePtrsubUndo::getExtraOffset(PcodeOp *op,int8 &multiplier) int8 RulePtrsubUndo::getExtraOffset(PcodeOp *op,int8 &multiplier)
{ {
int8 extra = 0; int8 extra = 0;
multiplier = 1; multiplier = 0;
int8 submultiplier; int8 submultiplier;
Varnode *outvn = op->getOut(); Varnode *outvn = op->getOut();
op = outvn->loneDescend(); op = outvn->loneDescend();
@ -6696,9 +6697,10 @@ int8 RulePtrsubUndo::getExtraOffset(PcodeOp *op,int8 &multiplier)
if (invn->isConstant()) // Only contribute to the extra if (invn->isConstant()) // Only contribute to the extra
extra += ptraddmult * (int8)invn->getOffset(); // if the index is constant extra += ptraddmult * (int8)invn->getOffset(); // if the index is constant
getConstOffsetBack(invn,submultiplier,DEPTH_LIMIT); // otherwise just contribute to multiplier getConstOffsetBack(invn,submultiplier,DEPTH_LIMIT); // otherwise just contribute to multiplier
submultiplier *= ptraddmult; if (submultiplier != 0)
if (submultiplier > multiplier) ptraddmult *= submultiplier;
multiplier = submultiplier; if (ptraddmult > multiplier)
multiplier = ptraddmult;
} }
else { else {
break; break;