[cfe-dev] C++ Annex K safe C11 functions

Jonny Grant via cfe-dev cfe-dev at lists.llvm.org
Sun Mar 3 07:46:25 PST 2019


Hi JF

Was just wondering how things were going adding these memset_s (and the 
others you mentioned).?

Jonny


On 04/01/2019 20:37, JF Bastien wrote:
> I think clang could offer builtins which provide some of the Annex K 
> building blocks, and let libc implementations provide the rest (using 
> the clang builtins when available).
>
> I’m interested in implementing these builtins, unless someone beats me 
> to it. User code often uses Annex K to provide guarantees that are now 
> redundant with trivial automatic variable initialization 
> (llvm.org/rL349442 <http://llvm.org/rL349442>), and I’d like to reduce 
> the hit they’re taking. Here are some notes I wrote for myself a 
> little while ago:
>
>     I’ll focus on memset, but this applies to other Annex K
>     functionality (memcpy_s, memmove_s, strcpy_s, strncpy_s, strcat_s,
>     strncat_s, strtok_s, memset_s, strerror_s, strerrorlen_s, strnlen_s).
>
>     These functions simply perform extra checks before calling their
>     regular equivalent, with an extra provision that the operation
>     can’t be as-if’d away (i.e. you have to do the entire memset).
>
>     Often, custom memset_s implementations are simple loops (cast to
>     char*, and set each byte to 0), compiled in a different TU, which,
>     amusingly thought LTO and inlining, would totally not obey the “no
>     as-if” rule. Other times they’re implemented in opaque assembly.
>
>     Clang doesn’t know about this function, and assumes it’s just
>     another function call. We should tell the compiler about what
>     these functions do so that it knows that stores prior to memset_s
>     are dead, memset_s can’t be removed, what the extra memset_s
>     checks are, and so that we can forward values from memset_s. We
>     can then generate better code (small loops become stores with a
>     loop, memset_s followed by stores get merged, etc).
>
>     A few options:
>
>     1. Make them a builtin, have libc implementations forward to the
>     builtin.
>     2. Teach clang / LLVM about these function’s semantics (i.e. if
>     conditions met, same as memset).
>     3. Add an attribute which teaches clang about memset-like
>     functions, and use it in libc implementations.
>     4. Use LTO between the projects and libc implementations, allowing
>     clang to peek into memset_s’s implementation.
>
>     I think 1. is the best approach.
>
>
>
>> On Jan 4, 2019, at 1:35 AM, Jonny Grant via cfe-dev 
>> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
>>
>> Thank you for your reply Richard.
>>
>> On 03/01/2019 22:04, Richard Smith wrote:
>>> On Thu, 3 Jan 2019 at 13:44, Jonny Grant via cfe-dev 
>>> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org> 
>>> <mailto:cfe-dev at lists.llvm.org>> wrote:
>>>    Hello
>>>    This file lists part of Annex K  "stdint.h"
>>> https://clang.llvm.org/doxygen/stdint_8h_source.html
>>>    But main C++ page doesn't mention Annex K. Is Annex K really fully
>>>    supported?
>>> That's generally not up to us; that's part of the C standard 
>>> library, not part of the compiler.
>>> The one part of Annex K that *is* part of the compiler, according to 
>>> the usual division of responsibilities, wherein the compiler 
>>> provides the freestanding headers and the C standard library 
>>> provides the rest, is the definition of rsize_t in <stddef.h> and 
>>> the definition of RSIZE_MAX in <stdint.h>, and Clang provides those 
>>> if __STDC_WANT_LIB_EXT1__ is defined. However, we do not define 
>>> __STDC_LIB_EXT1__ because, as noted, that's not up to us, and we 
>>> have no idea what your C standard library supports.
>>
>> I use glibc, it doesn't support Annex K. We are keen to use Annex K 
>> functionality, so looking around for options.
>>
>> Do you know if Clang has any intention to develop support for a libc 
>> C11 with Annex K Support?
>>
>>
>> I'm looking around, and came across this project
>> https://github.com/rurban/safeclib/blob/master/README
>>
>>
>>> So in that sense, we implement the part of Annex K that is in our 
>>> domain.
>>>    Some background
>>> https://clang.llvm.org/compatibility.html
>>> https://clang.llvm.org/cxx_status.html
>>> I'm not sure what these are supposed to show: Annex K is optional in 
>>> C, and not part of C++.
>>
>> It would be good if what you state could be added to the 
>> compatibility page, that Annex K is supported only for stdint.h, but 
>> that clang requires a libc which supports C11 Annex K 
>> functions/implementation.
>>
>> Cheers, Jonny
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20190303/20f7ba0a/attachment.html>


More information about the cfe-dev mailing list