|
Message-ID: <20170103231728.GJ1555@brightrain.aerifal.cx> Date: Tue, 3 Jan 2017 18:17:28 -0500 From: Rich Felker <dalias@...c.org> To: musl@...ts.openwall.com Subject: Re: libstdc++ namespace pollution On Tue, Jan 03, 2017 at 10:52:19PM +0000, Justin Cormack wrote: > On 3 January 2017 at 21:35, Rich Felker <dalias@...c.org> wrote: > > On Tue, Jan 03, 2017 at 09:16:29PM +0000, Justin Cormack wrote: > >> On 3 January 2017 at 18:29, Rich Felker <dalias@...c.org> wrote: > >> > On Tue, Jan 03, 2017 at 05:44:47PM +0000, Justin Cormack wrote: > >> >> I have been trying to build a C++ program recently, and came across > >> >> the issue that > >> >> > >> >> 1. libstdc++ always defines _GNU_SOURCE see > >> >> https://gcc.gnu.org/onlinedocs/libstdc++/faq.html#faq.predefined > >> >> 2. Musl defines pretty much everything once _GNU_SOURCE is defined > >> > > >> > So does glibc. :) > >> > >> This particular issue only happens with Musl, it includes more... > > > > That might be a bug/unwanted behavior on musl's side then. Could you > > help me check? I'd be happy to remove namespace-polluting cruft that's > > not actually needed to meet what applications can reasonably expect > > from _GNU_SOURCE. > > > > This minimal test case compiles with c++ on Debian but not on Alpine: > > #include <signal.h> > > class ArgumentParser_x64 { > enum Register { > REG_A, > REG_B, > REG_C, > REG_D, > REG_SI, > REG_DI, > REG_BP, > REG_SP, > REG_8, > REG_9, > REG_10, > REG_11, > REG_12, > REG_13, > REG_14, > REG_15, > REG_RIP, > }; > }; > > main() {} I see. It's a bit of luck that it happens to work on glibc, I think -- they define the REG_* identifiers as enum constants and then #define them to themselves in order to satisfy programs which are checking for their presence with #ifdef. So while the above code has macros clashing with the identifier names it wants to use, they end up being benign because they're defined to themselves. In general I don't do this (the enum approach) in musl because (1) I don't like enums, and (2) it breaks things that want to use the macros in preprocessor #if conditionals. However for macros like this that aren't specified by any standard and which are fundamentally namespace pollution, it seems like a better approach, so I'm not opposed to switching. We should probably do the same on all affected archs if we do. Rich
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.