<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div>Hi, Jeffrey. You're not going to be able to pass the assertion handler on the command line, but there are several well-established techniques for adding compiler-specific source annotations. The usual one looks something like this (from LLVM itself):</div><div><br></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div><div>#ifdef __GNUC__</div></div><div><div>#define LLVM_ATTRIBUTE_NORETURN __attribute__((noreturn))</div></div><div><div>#elif defined(_MSC_VER)</div></div><div><div>#define LLVM_ATTRIBUTE_NORETURN __declspec(noreturn)</div></div><div><div>#else</div></div><div><div>#define LLVM_ATTRIBUTE_NORETURN</div></div><div><div>#endif</div></div></blockquote><div><div><br></div></div><div>The analyzer actually has its own specific guard macro, __clang_analyzer__, so you could do something like this:</div><div><br></div><blockquote style="margin: 0 0 0 40px; border: none; padding: 0px;"><div>#ifdef __clang_analyzer__</div><div>#define ANALYZER_NORETURN __attribute__((analyzer_noreturn))</div><div>#else</div><div>#define ANALYZER_NORETURN</div><div>#endif</div></blockquote><div><br></div><div>As for termination, neither 'noreturn' nor 'analyzer_noreturn' actually relies on the program <i>immediately</i> terminating. The former just promises that the function, well, won't return, and SIGTRAP to get into a debugger (and then terminating from the debugger later) is a perfectly reasonable way to accomplish that.</div><div><br></div><div>Still, if you aren't sure 'noreturn' fully describes your situation, just use 'analyzer_noreturn'. This tells the analyzer to stop analyzing this particular path <i>(as</i> <i>if</i> the program had terminated), but does not affect compilation in any way.</div><div><br></div><div>Hope that helps,</div><div>Jordan</div><div><br></div><br><div><div>On Jun 7, 2013, at 18:54 , Jeffrey Walton <<a href="mailto:noloader@gmail.com">noloader@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hi All,<br><br>According to <a href="http://clang-analyzer.llvm.org/annotations.html#custom_assertions:">http://clang-analyzer.llvm.org/annotations.html#custom_assertions:</a><br><br><QUOTE><br>void foo(int *p) {<br>  assert(p != NULL);<br>}<br><br>When this code is preprocessed on Mac OS X it expands to the following:<br><br>void foo(int *p) {<br>  (__builtin_expect(!(p != NULL), 0) ? __assert_rtn(__func__, "t.c",<br>4, "p != NULL") : (void)0);<br>}<br><br>In this example, the assertion handler is __assert_rtn. When called,<br>most assertion handlers typically print an error and terminate the<br>program. The analyzer can exploit such semantics by ending the<br>analysis of a path once it hits a call to an assertion handler....<br><br>The analyzer knows about several well-known assertion handlers, but<br>can automatically infer if a function should be treated as an<br>assertion handler if it is annotated with the 'noreturn' attribute or<br>the (Clang-specific) 'analyzer_noreturn' attribute. Note that,<br>currently, clang does not support these attributes on Objective-C<br>methods and C++ methods.<br></QUOTE><br><br>I work with source files compiled under a number of compilers,<br>including GCC, ICC/ICPC, MSVC, and Clang. Some of the compilers don't<br>support GCC notations.<br><br>(1) Is there a way to pass the assertion handler to Clang on the<br>command line? (I typically use `ASSERT` rather than `assert`).<br><br>(2) Is there a way to indicate the failed assertion does *not*<br>terminate? (Calling abort() is useless behavior during development<br>(i.e., Debug builds), so my ASSERT raises a SIGTRAP on *nix. Plus,<br>Release builds don't include 'diagnostics' such as assert, so they are<br>not present in release builds).<br><br>Jeff<br>_______________________________________________<br>cfe-dev mailing list<br><a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev<br></blockquote></div><br></body></html>