<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Dec 17, 2014 at 6:05 PM, Morrison, Michael <span dir="ltr"><<a href="mailto:Michael_Morrison@playstation.sony.com" target="_blank">Michael_Morrison@playstation.sony.com</a>></span> wrote:<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal">Hi All – <u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I’ve created a first draft of a standalone Sphynx documentation page for the UndefinedBehaviorSanitizer (modelled after the ASan page [<a href="http://clang.llvm.org/docs/AddressSanitizer.html%5D" target="_blank">http://clang.llvm.org/docs/AddressSanitizer.html]</a>).  I envision that the information below would largely
 replace the many links to the <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> section of the Clang User’s Manual.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Please review the page below; you can send comments to me directly.  In particular, I’m not sure if the information in the “Supported Platforms”, “Limitations”, and “Current Status” sections is correct.  Thanks in advance for your review.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">==========================<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">UndefinedBehaviorSanitizer<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">==========================<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">.. contents::<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   :local:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Introduction<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">============<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">"Undefined behavior" is a concept known especially in the C and C++ languages.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Undefined behavior means that the semantics of a certain operation is undefined<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">by the language. For example, using a non-static variable before it has been
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">initialized leads to undefined behavior.
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">A program that can execute undefined behavior is not well-formed; thus, a
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">compiler assumes that undefined behavior cannot happen. It uses this assumption
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">to drive certain kinds of optimizations. When it encounters undefined behavior,
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">a compiler is free to act in any manner it chooses, either as an explicit
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">choice or as natural fallout from some algorithm.
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Note that undefined behavior is different from “implementation-defined behavior.”
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">For implementation-defined behavior, the program is well-formed and the compiler
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">must select a specific behavior and document the choices that it makes.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">UndefinedBehaviorSanitizer (UBSan) is a fast undefined-behavior detector
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">implemented in Clang and Compiler-rt. It consists of a compiler
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">instrumentation module and a run-time library. The tool can detect a<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">number of types of bugs, for example:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">* Use of a misaligned pointer or a null pointer.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">* Load of a ``bool`` value which is neither ``true`` nor ``false``.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">* Conversion to, from, or between floating-point types which would
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">  overflow the destination.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">* Floating point or integer division by zero.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">* Signed or unsigned integer overflow.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">The UndefinedBehaviorSanitizer has a small runtime cost and no impact on
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">address-space layout or ABI.</span></p></div></div></blockquote><div><br></div><div>Currently this whole introduction section has a totally different vibe (and hence seems sort of out of place) with the rest of the sanitizer docs. I'd like to handle the addition of this sort of "marketing"/"here's the user-facing version of why you should be interested in this" content in a separate patch. A short, succinct introduction like the other sanitizer docs is what would fit in best right now.</div><div><br></div><div>Currently the root clang docs page is filling up with various sanitizer docs with no clear indication of how they're related or why you should use them. I have been wanting for a while now to break out a Sanitizers.rst page targeted at compiler end-users which gives an overview of the sanitizers. That page would be a natural place for this "marketing"/"here's the user-facing version of why you should be interested in this" content (feel free to submit a patch adding it! It's low on my priority list right now). One thing to be resolved with this sort of content is that a lot of good content already exists, like <a href="https://code.google.com/p/thread-sanitizer/wiki/CppManual">https://code.google.com/p/thread-sanitizer/wiki/CppManual</a>, and we will need to decide how to integrate/link to it (thankfully we have easy contact with the people responsible with those pages to help figure out the best solution).</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-family:'Courier New'">
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">How to build<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">============<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Follow the `clang build instructions <../get_started.html>`_. CMake build is<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">supported.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Usage<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">=====<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Compile and link your program with the ``-f[no-]sanitize=check1,check2,...``
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">flag. To link to the appropriate runtime library, you must also provide the
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">``-fsanitize=`` argument. When using ``-fsanitize=vptr`` (or a group that
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">includes it, such as ``-fsanitize=undefined``) with a C++ program, the link
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">must be performed by ``clang++``, not ``clang``, in order to link against
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">the C++-specific parts of the runtime library.</span></p></div></div></blockquote><div><br></div><div>I would mention the basic usage of -fsanitize=undefined first and foremost. That you can fine-tune it is a "detail" that should occupy very little of the reader's time; merely making them aware that it is possible and pointing them to more info.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-family:'Courier New'"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">You cannot combine more than one of the ``-fsanitize=address``,
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">``-fsanitize=thread``, and ``-fsanitize=memory`` checkers in the same program.</span></p></div></div></blockquote><div><br></div><div>This is not directly ubsan related so I would omit it.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-family:'Courier New'">
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">The ``-fsanitize=undefined`` checks can be combined with other sanitizers.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">.. code-block:: console<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">    % cat example_UnsafeDivision.cc<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">    int32_t unsafe_div_int32_t (int32_t a, int32_t b) {<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">        return a / b;     // undefined if b==0<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">    }<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">    # Compile and link<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">    % clang -O1 -g -fsanitize=undefined example_UnsafeDivision.cc<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">or:</span></p></div></div></blockquote><div><br></div><div>Having both these examples seems redundant. Probably just the second one is fine since it is likely to match the user's workflow better.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-family:'Courier New'"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">.. code-block:: console<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">    # Compile<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">    % clang -O1 -g -fsanitize=undefined -c example_UnsafeDivision.cc<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">    # Link<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">    % clang++ -g -fsanitize=undefined example_UnsafeDivision.o<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">By default, after a sanitizer diagnoses an issue, it will attempt to continue
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">executing the program if there is a reasonable behavior it can give to the
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">faulting operation. You can include the ``-fno-sanitize-recover'' flag to cause
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">the program to abort instead.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">You can also provide the ``-fsanitize-undefined-trap-on-error`` flag to cause
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">traps to be emitted rather than calls to runtime libraries when a problem is
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">detected. This option is intended for use in cases where the sanitizer runtime
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">cannot be used (for example, when building libc or a kernel module). This option
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">is only compatible with the sanitizers in the ``undefined-trap`` group.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Undefined Behavior Checks<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">-------------------------<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Clang provides several ways to check for undefined behavior.</span></p></div></div></blockquote><div><br></div><div>This sentence seems incredibly redundant. Also, the title of this section should be something like "command line options".</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-family:'Courier New'"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">**-f[no-]sanitize=check1,check2,...**<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   Turn on runtime checks for various forms of undefined or suspicious<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   behavior.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   This option controls whether Clang adds runtime checks for various<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   forms of undefined or suspicious behavior, and is disabled by<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   default. If a check fails, a diagnostic message is produced at<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   runtime explaining the problem. The main checks are:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  .. _opt_fsanitize_undefined:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      ``-fsanitize=undefined``: Fast and compatible undefined behavior<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      checker. Enables the undefined behavior checks that have small<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      runtime cost and no impact on address space layout or ABI. This<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      includes all of the checks listed below other than<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      ``unsigned-integer-overflow``.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=undefined-trap``: This includes all sanitizers<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      included by ``-fsanitize=undefined``, except those that require<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      runtime support. This group of sanitizers is intended to be<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      used in conjunction with the ``-fsanitize-undefined-trap-on-error``<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      flag. This includes all of the checks listed below other than<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      ``unsigned-integer-overflow`` and ``vptr``.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   The following more fine-grained checks are also available:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=alignment``: Use of a misaligned pointer or creation<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      of a misaligned reference.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=bool``: Load of a ``bool`` value which is neither<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      ``true`` nor ``false``.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=bounds``: Out of bounds array indexing, in cases<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      where the array bound can be statically determined.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=enum``: Load of a value of an enumerated type which<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      is not in the range of representable values for that enumerated<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      type.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=float-cast-overflow``: Conversion to, from, or<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      between floating-point types which would overflow the<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      destination.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=float-divide-by-zero``: Floating point division by<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      zero.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=function``: Indirect call of a function through a<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      function pointer of the wrong type (Linux, C++ and x86/x86_64 only).<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=integer-divide-by-zero``: Integer division by zero.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=nonnull-attribute``: Passing null pointer as a function
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      parameter which is declared to never be null.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=null``: Use of a null pointer or creation of a null<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      reference.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=object-size``: An attempt to use bytes which the<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      optimizer can determine are not part of the object being<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      accessed. The sizes of objects are determined using<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      ``__builtin_object_size``, and consequently may be able to detect<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      more problems at higher optimization levels.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=return``: In C++, reaching the end of a<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      value-returning function without returning a value.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=returns-nonnull-attribute``: Returning null pointer
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      from a function which is declared to never return null.  
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=shift``: Shift operators where the amount shifted is<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      greater or equal to the promoted bit-width of the left-hand side<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      or less than zero, or where the left-hand side is negative. For a<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      signed left shift, also checks for signed overflow in C, and for<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      unsigned overflow in C++.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=signed-integer-overflow``: Signed integer overflow,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      including all the checks added by ``-ftrapv``, and checking for<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      overflow in signed division (``INT_MIN / -1``).<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=unreachable``: If control flow reaches<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      ``__builtin_unreachable``.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=unsigned-integer-overflow``: Unsigned integer<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      overflows.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=vla-bound``: A variable-length array whose bound<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      does not evaluate to a positive value.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">   -  ``-fsanitize=vptr``: Use of an object whose vptr indicates that<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      it is of the wrong dynamic type, or that its lifetime has not<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">      begun or has ended. Incompatible with ``-fno-rtti``.</span></p></div></div></blockquote><div><br></div><div>Maybe it would be better to add an anchor on the list in UsersManual.rst and link to it.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-family:'Courier New'"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Blacklist<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">---------<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">UndefinedBehaviorSanitizer supports entity types defined in
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">:doc:`SanitizerSpecialCaseList` that can be used to suppress error reports in the
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">specified source files or functions. Use ``-fsanitize-blacklist=/path/to/blacklist/file``
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">to disable or modify sanitizer checks for objects listed in the file. You can also use<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">``-fno-sanitize-blacklist`` to not use a blacklist file if it was specified earlier
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">in the command line.</span></p></div></div></blockquote><div><br></div><div>Everything but the first sentence here seems redundant.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><span style="font-family:'Courier New'"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Supported Platforms<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">===================<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">UndefinedBehaviorSanitizer is supported on<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">* Linux i386/x86\_64 (tested on Ubuntu 12.04);<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">* MacOS 10.6 - 10.9 (i386/x86\_64).<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">* Android ARM<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Ports to various other platforms are in progress.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Limitations<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">===========<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">* Static linking is not supported.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Current Status<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">==============<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">UndefinedBehaviorSanitizer is fully functional on supported platforms starting from LLVM<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">3.3. The test suite is integrated into CMake build and can be run with ``make<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">check-ubsan`` command.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">More Information<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">================<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">See `What Every C Programmer Should Know About Undefined Behavior
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><<a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html" target="_blank">http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html</a>>`_  from
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">the LLVM Project Blog and `A Guide to Undefined Behavior in C and C++ 
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><<a href="http://blog.regehr.org/archives/213" target="_blank">http://blog.regehr.org/archives/213</a>>`_ from John Regehr's *Embedded in
<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">Academia* blog for an introduction to Undefined Behavior in C and C++.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:'Courier New'">`<a href="http://www.chromium.org/developers/testing/undefinedbehaviorsanitizer" target="_blank">http://www.chromium.org/developers/testing/undefinedbehaviorsanitizer</a> <<a href="http://www.chromium.org/developers/testing/undefinedbehaviorsanitizer" target="_blank">http://www.chromium.org/developers/testing/undefinedbehaviorsanitizer</a>>`_<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10pt;font-family:Helv,sans-serif;color:purple">Cheers,<u></u><u></u></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:10pt;font-family:Helv,sans-serif;color:purple">Michael<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:14pt;font-family:'Cambria Math',serif;color:black">△</span><span style="font-size:14pt;font-family:Arial,sans-serif;color:black">○</span><span style="font-size:14pt;font-family:Helv,sans-serif;color:black">×</span><span style="font-size:14pt;font-family:Arial,sans-serif;color:black">□</span><span style="font-size:14pt;font-family:'Tms Rmn',serif;color:black">
</span><span style="font-size:12pt;font-family:'Tms Rmn',serif;color:black">   </span><span lang="JA" style="font-size:12pt;font-family:'MS Mincho';color:black">お疲れ様です</span><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>

<br>_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br></blockquote></div></div></div>