On Tue, Jul 30, 2013 at 7:46 AM, Sean McBride <span dir="ltr"><<a href="mailto:sean@rogue-research.com" target="_blank">sean@rogue-research.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Tue, 30 Jul 2013 07:00:52 -0400, Jeffrey Walton said:<br>
<br>
>I'm testing a crypto library under the sanitizers. Crypto libraries<br>
>are notorious for doing clever (and sometimes undefined) things to<br>
>integers.<br>
><br>
>I'm catching a number of errors similar to below. Is (or should)<br>
>unsigned wrap be an error condition? I thought it was implementation<br>
>defined. Or is -fsanitize=integer catching signed integer overflow<br>
>(which is undefined behavior) and incorrectly reporting it?<br>
<br>
</div>Unsigned wrapping is well-defined.  See here:<br>
<<a href="http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation" target="_blank">http://clang.llvm.org/docs/UsersManual.html#controlling-code-generation</a>><br>
<br>
Notice for "-fsanitize=integer" they say "Enables checks for undefined or suspicious integer behavior."  The 'suspicious' part refers to unsigned overflow, which, though well-defined, is often unexpected (though probably not in a crypto lib).<br>

<br>
I think you want -fsanitize=undefined.<br>
<div class="im"><br>
>Related: is -fsanize-integer Peng and Regehr's Integer Overflow<br>
>Checker? I'm very interested in IOC because Intel's ICC is ruthless<br>
>about removing code with undefined behavior.<br>
<br>
</div>It is.</blockquote><div><br></div><div>Actually, I would instead say that -fsanitize=integer is the spiritual successor of IOC. It is Regehr and Peng's idea, it is *not* the IOC implementation of that idea, but some of the implementation is due to their group. Here's the story:</div>
<div><br></div><div>-fsanitize=undefined ("UBSan") was inspired by IOC. With John Regehr's consent, I started with the intention of committing the IOC patches into upstream Clang. However, the scope of the project got extended to an attempt to catch a much more comprehensive set of undefined behavior, and what I ended with was a near-complete rewrite -- there is essentially no code in common between UBSan and IOC, and UBSan has a large number of other sanitizers that were never part of IOC. -fsanitize=unsigned-integer-overflow is not part of UBSan, since it is not a check for undefined behavior.</div>
<div><br></div><div>-fsanitize=integer is -fsanitize=undefined's checks for integer undefined behavior, plus -fsanitize=unsigned-integer-overflow, and its feature set is similar to that of IOC (but not exactly the same). -fsanitize=unsigned-integer-overflow was the work of Will Dietz, under (I believe) the direction of John Regehr, and Will also contributed various fixes and features to the rest of UBSan (in some cases, adding features that were present in IOC but not in UBSan).</div>
<div><br></div><div>Hope that clears things up somewhat.</div></div>