[BoundsChecking] Fix merging of sizes
authorArthur Eubanks <aeubanks@google.com>
Tue, 2 Aug 2022 17:43:30 +0000 (10:43 -0700)
committerArthur Eubanks <aeubanks@google.com>
Thu, 4 Aug 2022 00:21:19 +0000 (17:21 -0700)
commit203296d642c385da07a62098050b08493ed8b236
tree6151c175afc13aabdd3674c2d91879f687990e82
parenta2aa6809a8480ae45253613fb081fb138edcd80f
[BoundsChecking] Fix merging of sizes

BoundsChecking uses ObjectSizeOffsetEvaluator to keep track of the
underlying size/offset of pointers in allocations.  However,
ObjectSizeOffsetVisitor (something ObjectSizeOffsetEvaluator
uses to check for constant sizes/offsets)
doesn't quite treat sizes and offsets the same way as
BoundsChecking.  BoundsChecking wants to know the size of the
underlying allocation and the current pointer's offset within
it, but ObjectSizeOffsetVisitor only cares about the size
from the pointer to the end of the underlying allocation.

This only comes up when merging two size/offset pairs. Add a new mode to
ObjectSizeOffsetVisitor which cares about the underlying size/offset
rather than the size from the current pointer to the end of the
allocation.

Fixes a false positive with -fsanitize=bounds.

Reviewed By: vitalybuka, asbirlea

Differential Revision: https://reviews.llvm.org/D131001
llvm/include/llvm/Analysis/MemoryBuiltins.h
llvm/lib/Analysis/MemoryBuiltins.cpp
llvm/lib/Transforms/Instrumentation/BoundsChecking.cpp
llvm/test/Instrumentation/BoundsChecking/simple.ll