Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Sun, 7 Nov 2021 12:37:09 -0500
From: James Y Knight <>
Subject: Re: add noexcept to all functions please

On Sat, Nov 6, 2021 at 2:40 PM Joakim Sindholt <>

> On Sat, Nov 06, 2021 at 06:28:31PM +0000, Jon Chesterfield wrote:
> > That's a compiler bug, surely. A C function that takes no callbacks is
> not
> > going to throw.
> I don't think the compiler can prove that. As far as I know the extern
> "C" {} that C headers get wrapped in for C++ just means the compiler
> doesn't type-mangle function names. The function itself can not only
> throw by itself but it can also call other functions that throw as part
> of its implementation.

That's correct. In general, extern "C" functions are allowed to throw.

> If there's a compiler bug here it would have to be that it discards
> knowledge about C standard functions that can indeed not throw. I don't
> know if that's the case here, or if it's just nonstandard functions that
> are affected.

Some of the common standard functions are detected and treated specially by
compilers. Such libc functions that have special-casing are already
generally treated as non-throwing by both GCC and Clang. However, there are
a _lot_ of libc functions, both standard and nonstandard, that the compiler
doesn't hardcode any knowledge about.

> FWIW I don't think musl should tag any functions with anything just to
> make C++ marginally faster. This seems like a case of C++ getting
> hoisted by its own petard.

I have no horse in this race, but that really seems not a very helpful
attitude. There's a large number of users of libc who are using C++ rather
than C -- and many (most?) of them are compiling with exceptions enabled.
If adding minor cruft to all of the libc function declarations will make a
meaningful difference to all of that code's performance, that seems well
worth considering, regardless of anyone's opinions regarding decisions
about how to implement exceptions in C++ that were made 30 years ago.

Glibc defines macros for this purpose, which expand into "throw()" in C++
and "__attribute__((__nothrow__))" in GCC-C. The latter is only useful in
conjunction with an extremely-rarely-used feature, C code built with
-fexceptions enabled, and is thus probably ignorable.

Content of type "text/html" skipped

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.