mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
GP-3429 Intersect tests for stack affecting ops
This commit is contained in:
parent
d932173a25
commit
67b22166af
12 changed files with 432 additions and 15 deletions
|
@ -1239,8 +1239,8 @@ bool CircleRange::pushForwardBinary(OpCode opc,const CircleRange &in1,const Circ
|
|||
}
|
||||
int4 wholeSize = 8*sizeof(uintb) - count_leading_zeros(mask);
|
||||
if (in1.getMaxInfo() + in2.getMaxInfo() > wholeSize) {
|
||||
left = in1.left; // Covered everything
|
||||
right = in1.left;
|
||||
left = (in1.left * in2.left) % step;
|
||||
right = left; // Covered everything
|
||||
normalize();
|
||||
return true;
|
||||
}
|
||||
|
@ -1264,7 +1264,7 @@ bool CircleRange::pushForwardBinary(OpCode opc,const CircleRange &in1,const Circ
|
|||
uint4 tmp = sa;
|
||||
while(step < maxStep && tmp > 0) {
|
||||
step <<= 1;
|
||||
sa -= 1;
|
||||
tmp -= 1;
|
||||
}
|
||||
left = (in1.left << sa)&mask;
|
||||
right = (in1.right << sa)&mask;
|
||||
|
@ -1283,13 +1283,14 @@ bool CircleRange::pushForwardBinary(OpCode opc,const CircleRange &in1,const Circ
|
|||
int4 sa = (int4)in2.left * 8;
|
||||
mask = calc_mask(outSize);
|
||||
step = (sa == 0) ? in1.step : 1;
|
||||
uintb range = (in1.left < in1.right) ? in1.right-in1.left : in1.left - in1.right;
|
||||
|
||||
left = (in1.left >> sa)&mask;
|
||||
right = (in1.right >> sa)&mask;
|
||||
if ((left& ~mask) != (right & ~mask)) { // Truncated part is different
|
||||
if (range == 0 || ((range >> sa) > mask )) {
|
||||
left = right = 0; // We cover everything
|
||||
}
|
||||
else {
|
||||
left = in1.left >> sa;
|
||||
right = ((in1.right - in1.step) >> sa) + step;
|
||||
left &= mask;
|
||||
right &= mask;
|
||||
normalize();
|
||||
|
@ -1331,7 +1332,7 @@ bool CircleRange::pushForwardBinary(OpCode opc,const CircleRange &in1,const Circ
|
|||
valLeft = sign_extend(valLeft,bitPos);
|
||||
}
|
||||
left = (valLeft >> sa) & mask;
|
||||
right = (valRight >> sa) & mask;
|
||||
right = (((valRight - in1.step) >> sa) + 1) & mask;
|
||||
if (left == right) // Don't truncate accidentally to everything
|
||||
right = (left + 1)&mask;
|
||||
break;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue