<br><br><div class="gmail_quote">On Sun, Nov 28, 2010 at 4:03 PM, Ted Kremenek <span dir="ltr"><<a href="mailto:kremenek@apple.com">kremenek@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div style="word-wrap:break-word">Hmm.  I think I see what you mean.  I agree that removing the use of StripCasts() is appropriate.<div><br></div><div><div>That said, do you think both ReturnPointerRangeChecker and ArrayBoundChecker are doing the bounds checks in the most appropriate way?  I think the motivation for using StripCasts() (even though it was wrong) was to try and reason about out-of-bounds accesses using the extent of the raw memory region.</div>
<div><br></div><div>For example, this is what is going on in RegionStore::getSizeInElements():</div><div><br></div><div><div>  DefinedOrUnknownSVal RegionStoreManager::getSizeInElements(const GRState *state,</div><div>                                                             const MemRegion *R,</div>
<div>                                                             QualType EleTy) {</div><div>    SVal Size = cast<SubRegion>(R)->getExtent(ValMgr);</div><div>    SValuator &SVator = ValMgr.getSValuator();</div>
</div><div>    ...</div><div><br></div><div>I think the motivation for using StripCasts() what so that we were doing the bounds check relative to the base memory region (for which we have an extent).  By removing the use of StripCasts(), any time (I believe) we introduce an ElementRegion due to a cast this bounds check won't work.</div>
<div><br></div><div>Should we instead be doing the bounds check in terms of raw offsets (relative to the underlying base region)?</div></div></div></blockquote><div><br></div><div>You are right! We should be doing the bounds check in terms of raw offsets. The current check is wrong.</div>
<div><br></div><div> </div></div>