[RFC] Deprecate _REENTRANT and _THREAD_SAFE.
Commit Message
For many years, the only effect of these macros has been to make
unistd.h declare getlogin_r. _POSIX_C_SOURCE >= 199506L also causes
this function to be declared. However, people who don't carefully
read all the headers might be confused into thinking they need to
define _REENTRANT for any threaded code (as was indeed the case a long
time ago).
Therefore, I propose to make _REENTRANT and _THREAD_SAFE into aliases
for _POSIX_C_SOURCE=199506L, and issue a deprecation warning when a
higher conformance level was not selected some other way.
For instance, -std=c89 -D_REENTRANT will warn, but
-std=c99 -D_POSIX_C_SOURCE=200809L -D_REENTRANT won't, and
-D_REENTRANT all by itself also won't, because _DEFAULT_SOURCE implies
_POSIX_C_SOURCE > 199506. I could be persuaded to make that final
case also warn.
zw
* NEWS: The feature selection macros _REENTRANT and _THREAD_SAFE
are deprecated.
* include/features.h: Treat _REENTRANT and _THREAD_SAFE as
synonyms for _POSIX_C_SOURCE=199506L, if a higher POSIX
conformance level has not been selected by other macros.
* posix/unistd.h, posix/bits/unistd.h: Don't check __USE_REENTRANT.
---
NEWS | 10 ++++++++++
include/features.h | 39 +++++++++++++++++++++++++--------------
posix/bits/unistd.h | 2 +-
posix/unistd.h | 2 +-
4 files changed, 37 insertions(+), 16 deletions(-)
Comments
On 12/06/2016 04:22 PM, Zack Weinberg wrote:
> For many years, the only effect of these macros has been to make
> unistd.h declare getlogin_r. _POSIX_C_SOURCE >= 199506L also causes
> this function to be declared. However, people who don't carefully
> read all the headers might be confused into thinking they need to
> define _REENTRANT for any threaded code (as was indeed the case a long
> time ago).
You should get rid of the internal #define and #undef of _REENTRANT, too.
Thanks,
Florian
On Tue, 6 Dec 2016, Zack Weinberg wrote:
> -D_REENTRANT all by itself also won't, because _DEFAULT_SOURCE implies
> _POSIX_C_SOURCE > 199506. I could be persuaded to make that final
> case also warn.
Given that GCC specs include %{pthread:-D_REENTRANT} (in many
architecture-specific specs), and that -pthread is (approximately) an
OS-independent way of saying to add whatever compiler and linker options
are needed for threads, I'd discourage warning in that case.
On 12/06/2016 11:46 AM, Joseph Myers wrote:
> On Tue, 6 Dec 2016, Zack Weinberg wrote:
>
>> -D_REENTRANT all by itself also won't, because _DEFAULT_SOURCE implies
>> _POSIX_C_SOURCE > 199506. I could be persuaded to make that final
>> case also warn.
>
> Given that GCC specs include %{pthread:-D_REENTRANT} (in many
> architecture-specific specs), and that -pthread is (approximately) an
> OS-independent way of saying to add whatever compiler and linker options
> are needed for threads, I'd discourage warning in that case.
Yeah, that's plenty good enough reason not to warn.
zw
On 06 Dec 2016 11:48, Zack Weinberg wrote:
> On 12/06/2016 11:46 AM, Joseph Myers wrote:
> > On Tue, 6 Dec 2016, Zack Weinberg wrote:
> >> -D_REENTRANT all by itself also won't, because _DEFAULT_SOURCE implies
> >> _POSIX_C_SOURCE > 199506. I could be persuaded to make that final
> >> case also warn.
> >
> > Given that GCC specs include %{pthread:-D_REENTRANT} (in many
> > architecture-specific specs), and that -pthread is (approximately) an
> > OS-independent way of saying to add whatever compiler and linker options
> > are needed for threads, I'd discourage warning in that case.
>
> Yeah, that's plenty good enough reason not to warn.
another data point: these defines are used beyond glibc, so if we were to
make it annoying for people to rely on them, it'd just make people trying
to support multiple OS's difficult for no gain. here's one project where,
because gcc *wasn't* setting up these defines in their specs, the program
failed to build correctly for some targets:
https://bugs.gentoo.org/543114
-mike
@@ -22,6 +22,16 @@ Version 2.25
from that TS. Note that most features from that TS are not supported by
the GNU C Library.
+* The feature test macros _REENTRANT and _THREAD_SAFE are deprecated, and
+ will henceforth be treated as synonyms for _POSIX_C_SOURCE=199506L.
+ For many years, their only effect has been to cause <unistd.h> to declare
+ getlogin_r; _POSIX_C_SOURCE=199506L has the same effect. Since the
+ GNU C Library defaults to a much newer revision of POSIX, this will
+ only affect programs that specifically request an old conformance mode.
+ (For instance, a program compiled with -std=c89 -D_REENTRANT will see a
+ change in the visible declarations, but a program compiled with
+ -std=c99 -D_POSIX_C_SOURCE=200809L -D_REENTRANT will not.)
+
* The inclusion of <sys/sysmacros.h> by <sys/types.h> is deprecated. This
means that in a future release, the macros “majorâ€, “minorâ€, and “makedevâ€
will only be available from <sys/sysmacros.h>.
@@ -24,10 +24,13 @@
__STRICT_ANSI__ ISO Standard C.
_ISOC99_SOURCE Extensions to ISO C89 from ISO C99.
_ISOC11_SOURCE Extensions to ISO C99 from ISO C11.
- __STDC_WANT_LIB_EXT2__ Extensions to ISO C99 from TR 27431-2:2010.
- __STDC_WANT_IEC_60559_BFP_EXT__ Extensions to ISO C11 from TS 18661-1:2014.
- __STDC_WANT_IEC_60559_FUNCS_EXT__ Extensions to ISO C11 from
- TS 18661-4:2015.
+ __STDC_WANT_LIB_EXT2__
+ Extensions to ISO C99 from TR 27431-2:2010.
+ __STDC_WANT_IEC_60559_BFP_EXT__
+ Extensions to ISO C11 from TS 18661-1:2014.
+ __STDC_WANT_IEC_60559_FUNCS_EXT__
+ Extensions to ISO C11 from TS 18661-4:2015.
+
_POSIX_SOURCE IEEE Std 1003.1.
_POSIX_C_SOURCE If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
if >=199309L, add IEEE Std 1003.1b-1993;
@@ -45,10 +48,12 @@
_GNU_SOURCE All of the above, plus GNU extensions.
_DEFAULT_SOURCE The default set of features (taking precedence over
__STRICT_ANSI__).
- _REENTRANT Select additionally reentrant object.
- _THREAD_SAFE Same as _REENTRANT, often used by other systems.
- _FORTIFY_SOURCE If set to numeric value > 0 additional security
- measures are defined, according to level.
+
+ _FORTIFY_SOURCE Add security hardening to many library functions.
+ Set to 1 or 2; 2 performs stricter checks than 1.
+
+ _REENTRANT, _THREAD_SAFE
+ Obsolete; equivalent to _POSIX_C_SOURCE=199506L.
The `-ansi' switch to the GNU C compiler, and standards conformance
options such as `-std=c99', define __STRICT_ANSI__. If none of
@@ -86,7 +91,6 @@
__USE_MISC Define things from 4.3BSD or System V Unix.
__USE_ATFILE Define *at interfaces and AT_* constants for them.
__USE_GNU Define GNU extensions.
- __USE_REENTRANT Define reentrant/thread-safe *_r functions.
__USE_FORTIFY_LEVEL Additional security measures used, according to level.
The macros `__GNU_LIBRARY__', `__GLIBC__', and `__GLIBC_MINOR__' are
@@ -130,7 +134,6 @@
#undef __USE_MISC
#undef __USE_ATFILE
#undef __USE_GNU
-#undef __USE_REENTRANT
#undef __USE_FORTIFY_LEVEL
#undef __KERNEL_STRICT_NAMES
@@ -253,6 +256,7 @@
# undef _POSIX_C_SOURCE
# define _POSIX_C_SOURCE 200809L
#endif
+
#if ((!defined __STRICT_ANSI__ \
|| (defined _XOPEN_SOURCE && (_XOPEN_SOURCE - 0) >= 500)) \
&& !defined _POSIX_SOURCE && !defined _POSIX_C_SOURCE)
@@ -269,6 +273,17 @@
# define __USE_POSIX_IMPLICITLY 1
#endif
+/* _REENTRANT and _THREAD_SAFE are obsolete aliases for _POSIX_C_SOURCE=199506L.
+ Only issue a warning if _POSIX_C_SOURCE was not already defined to
+ an equivalent or higher level some other way. */
+#if ((!defined _POSIX_C_SOURCE || (_POSIX_C_SOURCE - 0) < 199506L) \
+ && (defined _REENTRANT || defined _THREAD_SAFE))
+# warning "_REENTRANT and _THREAD_SAFE are deprecated, use _POSIX_C_SOURCE"
+# define _POSIX_SOURCE 1
+# undef _POSIX_C_SOURCE
+# define _POSIX_C_SOURCE 199506L
+#endif
+
#if (defined _POSIX_SOURCE \
|| (defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 1) \
|| defined _XOPEN_SOURCE)
@@ -351,10 +366,6 @@
# define __USE_GNU 1
#endif
-#if defined _REENTRANT || defined _THREAD_SAFE
-# define __USE_REENTRANT 1
-#endif
-
#if defined _FORTIFY_SOURCE && _FORTIFY_SOURCE > 0
# if !defined __OPTIMIZE__ || __OPTIMIZE__ <= 0
# warning _FORTIFY_SOURCE requires compiling with optimization (-O)
@@ -302,7 +302,7 @@ __NTH (ttyname_r (int __fd, char *__buf, size_t __buflen))
}
-#if defined __USE_REENTRANT || defined __USE_POSIX199506
+#ifdef __USE_POSIX199506
extern int __getlogin_r_chk (char *__buf, size_t __buflen, size_t __nreal)
__nonnull ((1));
extern int __REDIRECT (__getlogin_r_alias, (char *__buf, size_t __buflen),
@@ -849,7 +849,7 @@ extern int tcsetpgrp (int __fd, __pid_t __pgrp_id) __THROW;
This function is a possible cancellation point and therefore not
marked with __THROW. */
extern char *getlogin (void);
-#if defined __USE_REENTRANT || defined __USE_POSIX199506
+#ifdef __USE_POSIX199506
/* Return at most NAME_LEN characters of the login name of the user in NAME.
If it cannot be determined or some other error occurred, return the error
code. Otherwise return 0.