<div dir="ltr"><div>Sorry for delay.</div><div><br></div>+Richard<div><br></div><div>I think we are interested in adding these checks to Clang. I'll try to take a look at how hard it is to implement them in the frontend (it shouldn't be so), and then work on landing your patch into compiler-rt. Thanks!</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jun 27, 2014 at 12:33 AM, Jakub Jelinek <span dir="ltr"><<a href="mailto:jakub@redhat.com" target="_blank">jakub@redhat.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi!<br>
<br>
I wrote yesterday undefined behavior sanitization for nonnull and<br>
returns_nonnull attributes for GCC, see<br>
<a href="http://gcc.gnu.org/ml/gcc-patches/2014-06/msg02181.html" target="_blank">http://gcc.gnu.org/ml/gcc-patches/2014-06/msg02181.html</a><br>
Users ran into issues with calling e.g. memset with NULL argument<br>
(and zero length), or similarly for qsort, the C99 standard says that is<br>
undefined behavior.<br>
We are using the compiler-rt libubsan library and AFAIK clang also added<br>
the nonnull and returns_nonnull attributes, therefore I wonder if you are<br>
interested in accepting this into compiler-rt libubsan (and reserve<br>
-fsanitize=nonnull and -fsanitize=returns-nonnull for command line<br>
compatibility if you want).<br>
<br>
If there is no interest in these, we could perhaps add GCC owned files<br>
to libsanitize/ubsan/, but then the two libraries would start to diverge.<br>
<br>
--- compiler-rt/lib/ubsan/ubsan_handlers.h.jj   2013-11-12 19:35:28.899621282 +0100<br>
+++ compiler-rt/lib/ubsan/ubsan_handlers.h      2014-06-27 09:18:27.856015669 +0200<br>
@@ -121,6 +121,20 @@ RECOVERABLE(function_type_mismatch,<br>
             FunctionTypeMismatchData *Data,<br>
             ValueHandle Val)<br>
<br>
+struct NonNullArgData {<br>
+  SourceLocation Loc;<br>
+};<br>
+<br>
+/// \brief Handle passing null to function argument with nonnull attribute.<br>
+RECOVERABLE(nonnull_arg, NonNullArgData *Data, uptr ArgNo)<br>
+<br>
+struct NonNullRetData {<br>
+  SourceLocation Loc;<br>
+};<br>
+<br>
+/// \brief Handle returning null from function with returns_nonnull attribute.<br>
+RECOVERABLE(nonnull_return, NonNullRetData *Data)<br>
+<br>
 }<br>
<br>
 #endif // UBSAN_HANDLERS_H<br>
--- compiler-rt/lib/ubsan/ubsan_handlers.cc.jj  2013-11-12 19:35:28.954620998 +0100<br>
+++ compiler-rt/lib/ubsan/ubsan_handlers.cc     2014-06-27 09:18:27.856015669 +0200<br>
@@ -279,3 +279,31 @@ void __ubsan::__ubsan_handle_function_ty<br>
   __ubsan_handle_function_type_mismatch(Data, Function);<br>
   Die();<br>
 }<br>
+<br>
+void __ubsan::__ubsan_handle_nonnull_arg(NonNullArgData *Data, uptr ArgNo) {<br>
+  SourceLocation Loc = Data->Loc.acquire();<br>
+  if (Loc.isDisabled())<br>
+    return;<br>
+<br>
+  Diag(Loc, DL_Error, "null argument where non-null required "<br>
+                     "(argument %0)") << ArgNo;<br>
+}<br>
+<br>
+void __ubsan::__ubsan_handle_nonnull_arg_abort(NonNullArgData *Data,<br>
+                                              uptr ArgNo) {<br>
+  __ubsan::__ubsan_handle_nonnull_arg(Data, ArgNo);<br>
+  Die();<br>
+}<br>
+<br>
+void __ubsan::__ubsan_handle_nonnull_return(NonNullRetData *Data) {<br>
+  SourceLocation Loc = Data->Loc.acquire();<br>
+  if (Loc.isDisabled())<br>
+    return;<br>
+<br>
+  Diag(Loc, DL_Error, "null return value where non-null required");<br>
+}<br>
+<br>
+void __ubsan::__ubsan_handle_nonnull_return_abort(NonNullRetData *Data) {<br>
+  __ubsan::__ubsan_handle_nonnull_return(Data);<br>
+  Die();<br>
+}<br>
<br>
        Jakub<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>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div dir="ltr">Alexey Samsonov<br><a href="mailto:vonosmas@gmail.com" target="_blank">vonosmas@gmail.com</a></div>
</div>