| 772 | } |
| 773 | |
| 774 | static expr at_least_same_offseting(const Pointer &p1, const Pointer &p2, |
| 775 | bool any_stack) { |
| 776 | expr size = p1.blockSizeOffsetT(); |
| 777 | expr off = p1.getOffsetSizet(); |
| 778 | expr size2 = p2.blockSizeOffsetT(); |
| 779 | expr off2 = p2.getOffsetSizet(); |
| 780 | return |
| 781 | expr::mkIf(p1.isHeapAllocated(), |
| 782 | p1.getAllocType() == p2.getAllocType() && |
| 783 | off == off2 && size == size2, |
| 784 | |
| 785 | any_stack |
| 786 | ? expr(true) |
| 787 | :expr::mkIf(off.sge(0), |
| 788 | off2.sge(0) && |
| 789 | expr::mkIf(off.ule(size), |
| 790 | off2.ule(size2) && off2.uge(off) && |
| 791 | (size2 - off2).uge(size - off), |
| 792 | off2.ugt(size2) && off == off2 && |
| 793 | size2.uge(size)), |
| 794 | // maintains same dereferenceability before/after |
| 795 | off == off2 && size2.uge(size))); |
| 796 | } |
| 797 | |
| 798 | expr Pointer::refined(const Pointer &other) const { |
| 799 | bool is_asm = other.m.isAsmMode(); |
no test coverage detected