fix truncation in GEP offset computation with very large types
Reported by
MODIFY
ir/instr.cpp
ir/instr.cpp
@@ -3234,7 +3234,7 @@ void GEP::print(ostream &os) const {
StateValue GEP::toSMT(State &s) const {
auto scalar = [&](const StateValue &ptrval,
- vector<pair<unsigned, StateValue>> &offsets) -> StateValue {
+ vector<pair<uint64_t, StateValue>> &offsets) -> StateValue {
Pointer ptr(s.getMemory(), ptrval.value);
AndExpr non_poison(ptrval.non_poison);
@@ -3275,7 +3275,7 @@ StateValue GEP::toSMT(State &s) const {
bool ptr_isvect = ptr->getType().isVectorType();
for (unsigned i = 0, e = aty->numElementsConst(); i != e; ++i) {
- vector<pair<unsigned, StateValue>> offsets;
+ vector<pair<uint64_t, StateValue>> offsets;
for (auto &[sz, idx] : idxs) {
if (auto idx_aty = idx->getType().getAsAggregateType())
offsets.emplace_back(sz, idx_aty->extract(s[*idx], i));
@@ -3287,7 +3287,7 @@ StateValue GEP::toSMT(State &s) const {
}
return getType().getAsAggregateType()->aggregateVals(vals);
}
- vector<pair<unsigned, StateValue>> offsets;
+ vector<pair<uint64_t, StateValue>> offsets;
for (auto &[sz, idx] : idxs)
offsets.emplace_back(sz, s[*idx]);
return scalar(s[*ptr], offsets);

ADD
tests/alive-tv/memory/gep-large.srctgt.ll
+%0 = type { %1, %1, %1, %1, %1, %1, %1, %1 }
+%1 = type { %2, %2, %2, %2, %2, %2, %2, %2 }
+%2 = type { %3, %3, %3, %3, %3, %3, %3, %3 }
+%3 = type { %4, %4, %4, %4, %4, %4, %4, %4 }
+%4 = type { %5, %5, %5, %5, %5, %5, %5, %5 }
+%5 = type { %6, %6, %6, %6, %6, %6, %6, %6 }
+%6 = type { %7, %7, %7, %7, %7, %7, %7, %7 }
+%7 = type { %8, %8, %8, %8, %8, %8, %8, %8 }
+%8 = type { %9, %9, %9, %9, %9, %9, %9, %9 }
+%9 = type { %10, %10, %10, %10, %10, %10, %10, %10 }
+%10 = type { %11, %11, %11, %11, %11, %11, %11, %11 }
+%11 = type { %12, %12, %12, %12, %12, %12, %12, %12 }
+%12 = type { %13, %13, %13, %13, %13, %13, %13, %13 }
+%13 = type { i32, i32 }
+
+define i64 @src() {
+ ret i64 ptrtoint (%0* getelementptr (%0, %0* null, i32 1) to i64)
+}
+
+define i64 @tgt() {
+ ret i64 4398046511104
+}

fix truncation in GEP offset computation with very large types
Reported by @regehr