restore type of NULL to void * except when used in C++ programs
authorRich Felker <dalias@aerifal.cx>
Mon, 25 Nov 2013 02:42:55 +0000 (21:42 -0500)
committerRich Felker <dalias@aerifal.cx>
Mon, 25 Nov 2013 02:42:55 +0000 (21:42 -0500)
unfortunately this eliminates the ability of the compiler to diagnose
some dangerous/incorrect usage, but POSIX requires (as an extension to
the C language, i.e. CX shaded) that NULL have type void *. plain C
allows it to be defined as any null pointer constant.

the definition 0L is preserved for C++ rather than reverting to plain
0 to avoid dangerous behavior in non-conforming programs which use
NULL as a variadic sentinel. (it's impossible to use (void *)0 for C++
since C++ lacks the proper implicit pointer conversions, and other
popular alternatives like the GCC __null extension seem non-conforming
to the standard's requirements.)

include/locale.h
include/stddef.h
include/stdio.h
include/stdlib.h
include/string.h
include/time.h
include/unistd.h
include/wchar.h

index 7e80fd9..ce38438 100644 (file)
@@ -7,7 +7,11 @@ extern "C" {
 
 #include <features.h>
 
+#ifdef __cplusplus
 #define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
 
 #define LC_CTYPE    0
 #define LC_NUMERIC  1
index 9d52248..0a32919 100644 (file)
@@ -1,7 +1,11 @@
 #ifndef _STDDEF_H
 #define _STDDEF_H
 
+#ifdef __cplusplus
 #define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
 
 #define __NEED_ptrdiff_t
 #define __NEED_size_t
index cd60bb5..884d2e6 100644 (file)
@@ -21,7 +21,11 @@ extern "C" {
 
 #include <bits/alltypes.h>
 
+#ifdef __cplusplus
 #define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
 
 #undef EOF
 #define EOF (-1)
index 2bd5f10..1e67b89 100644 (file)
@@ -7,7 +7,11 @@ extern "C" {
 
 #include <features.h>
 
+#ifdef __cplusplus
 #define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
 
 #define __NEED_size_t
 #define __NEED_wchar_t
index d441233..ff9badb 100644 (file)
@@ -7,7 +7,11 @@ extern "C" {
 
 #include <features.h>
 
+#ifdef __cplusplus
 #define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
 
 #define __NEED_size_t
 #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
index 6e499ff..7057409 100644 (file)
@@ -7,7 +7,12 @@ extern "C" {
 
 #include <features.h>
 
+#ifdef __cplusplus
 #define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
+
 
 #define __NEED_size_t
 #define __NEED_time_t
index a00a9c4..9f2fac9 100644 (file)
@@ -15,7 +15,11 @@ extern "C" {
 #define SEEK_CUR 1
 #define SEEK_END 2
 
+#ifdef __cplusplus
 #define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
 
 #define __NEED_size_t
 #define __NEED_ssize_t
index fd5aac5..9fd967c 100644 (file)
@@ -33,7 +33,11 @@ extern "C" {
 #define WCHAR_MIN (-1-0x7fffffff+L'\0')
 #endif
 
+#ifdef __cplusplus
 #define NULL 0L
+#else
+#define NULL ((void*)0)
+#endif
 
 #undef WEOF
 #define WEOF 0xffffffffU