[LLVMdev] Compile time checks and GCC's '__warning__' attribute
coles.david at gmail.com
coles.david at gmail.com
Tue May 6 06:39:27 PDT 2014
Hi,
I've been trying to implement some basic compile time checks such as using
"__builtin_object_size" to verify certain preconditions (such as ensuring a
function that is passed a byte array contains a minimum number of bytes).
This turned out to be a little tricker than expected as "_Static_assert"
and similar mechanisms can't be used since "__builtin_object_size" can't be
used as a integral constant expression.
Most GCC code I've looked at uses the "__warning__" or "__error__"
attributes to declare trap functions that if not eliminated via dead-code
elimination will generate a compiler warning or error (big improvement over
just a runtime abort). For example:
size_t d_len = __builtin_object_size(d, 0);
if (__builtin_constant_p(copy_amount) && (copy_amount > d_len)) {
// declared with __attribute__((__error__("memcpy called with size
bigger than destination")));
__memcpy_dest_size_error();
}
Sadly neither of these attributes are currently supported in Clang. Is this
a reasonable feature request or does Clang have some better mechanism?
(Perhaps the Static Analyzer?)
I notice that Clang supports both the "deprecated" and "unavailable"
attributes, but these serve a slightly different purpose of warning or
preventing a user from calling certain functions.
Probably the most promising option appears to be Clang 3.5's new
"enable_if" function attribute that could be used to make the function
unavailable if it violates certain preconditions.
Cheers,
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140506/0d08175a/attachment.html>
More information about the llvm-dev
mailing list