Re: improving C++ libc headers

From: Enji Cooper <yaneurabeya_at_gmail.com>
Date: Tue, 30 Jan 2024 19:12:16 UTC
> On Jan 30, 2024, at 05:31, Lexi Winter <lexi@le-fay.org> wrote:
> 
> hi list,
> 
> i am considering working up a patch to improve C++ libc headers in FreeBSD.
> 
> the problem with the current headers (which come from clang/libc++) is
> that this code compiles:
> 
> ------
> #include <cstdlib>
> auto main() -> int {
>    exit(0);
> }
> ------
> 
> this should be a compile-time error, because <cstdio> does not declare
> ::exit[0].  however, it works because <cstdlib> is implemented like
> this:
> 
> ------
> #include <stdlib.h> // exposes ::exit()
> 
> namespace std {
>    using ::exit;
>    // ...
> }
> ------
> 
> i would like to replace this with an implementation that does this
> instead:
> 
> ------
> namespace std {
>    extern "C" void exit(int);
>    // ...
> }
> ------
> 
> i have done a very quick proof of concept for this and it does work;
> there are some more complicated edge cases, but nothing that can't be
> dealt with from what i can see.
> 
> but before i put any amount of significant effort into this, i'd like to
> check if this is something that is likely to be merged.
> 
> to address some potential objections:
> 
> - i don't believe this can be handled upstream in libc++, because some
>  of these headers require knowledge of the implementation - <cstdio>
>  needs to know about 'struct __sFILE', for example.
> 
> - "import std" should solve this properly, but there are a lot of
>  implementation issues with this and it's not clear if/when it will
>  ever be supported; in the mean time, the existing standard headers
>  should behave correctly.
> 
> [0] https://www.eel.is/c++draft/cstdlib.syn#header:%3Ccstdlib%3E
> [1] https://cgit.freebsd.org/src/tree/contrib/llvm-project/libcxx/include/cstdlib

Hi Lexi!
That’s an interesting proposal!
Given that this is a third-party library, I think it’s best to submit this proposal and patches up to the LLVM project (there are some folks in the FreeBSD project who are connected to LLVM, but arch is a wider distribution of folks and might not overlap with those individuals). The proposal would be beneficial to multiple OSes—not just FreeBSD. Moreover, you might be able to convince others in the LLVM project to work with you to achieve the desired outcome sooner.
Thank you again for sharing and starting this discussion!
Cheers!
-Enji