regen/warnings.pl: Fix undefined C behavior
authorKarl Williamson <khw@cpan.org>
Mon, 31 Dec 2018 04:29:07 +0000 (21:29 -0700)
committerKarl Williamson <khw@cpan.org>
Sat, 5 Jan 2019 17:42:26 +0000 (10:42 -0700)
This fixes compiler warnings "performing pointer arithmetic on a null
pointer has undefined behavior"

There are several ways to fix this.  This one was suggested by
Tomasz Konojacki++.  Instead of trying to point to address 1 and 2, two
variables are created, and we point to them.  const is cast away.

globvar.sym
perl.h
regen/warnings.pl
warnings.h

index 6fb387c..476f4ca 100644 (file)
@@ -83,4 +83,6 @@ PL_warn_nl
 PL_warn_nosemi
 PL_warn_reserved
 PL_warn_uninit
+PL_WARN_ALL
+PL_WARN_NONE
 PL_watch_pvx
diff --git a/perl.h b/perl.h
index 43b42a8..dd66b12 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -4454,6 +4454,11 @@ EXTCONST char PL_Zero[]
 EXTCONST char PL_hexdigit[]
   INIT("0123456789abcdef0123456789ABCDEF");
 
+EXTCONST STRLEN PL_WARN_ALL
+  INIT(0);
+EXTCONST STRLEN PL_WARN_NONE
+  INIT(0);
+
 /* This is constant on most architectures, a global on OS/2 */
 #ifndef OS2
 EXTCONST char PL_sh_path[]
index 9c01e67..d244160 100644 (file)
@@ -322,8 +322,8 @@ my ($index, $warn_size);
 #define G_WARN_ALL_MASK                (G_WARN_ALL_ON|G_WARN_ALL_OFF)
 
 #define pWARN_STD              NULL
-#define pWARN_ALL              (((STRLEN*)0)+1)    /* use warnings 'all' */
-#define pWARN_NONE             (((STRLEN*)0)+2)    /* no  warnings 'all' */
+#define pWARN_ALL              (STRLEN *) &PL_WARN_ALL    /* use warnings 'all' */
+#define pWARN_NONE             (STRLEN *) &PL_WARN_NONE   /* no  warnings 'all' */
 
 #define specialWARN(x)         ((x) == pWARN_STD || (x) == pWARN_ALL ||        \
                                 (x) == pWARN_NONE)
index e0c12ed..58f5227 100644 (file)
@@ -18,8 +18,8 @@
 #define G_WARN_ALL_MASK                (G_WARN_ALL_ON|G_WARN_ALL_OFF)
 
 #define pWARN_STD              NULL
-#define pWARN_ALL              (((STRLEN*)0)+1)    /* use warnings 'all' */
-#define pWARN_NONE             (((STRLEN*)0)+2)    /* no  warnings 'all' */
+#define pWARN_ALL              (STRLEN *) &PL_WARN_ALL    /* use warnings 'all' */
+#define pWARN_NONE             (STRLEN *) &PL_WARN_NONE   /* no  warnings 'all' */
 
 #define specialWARN(x)         ((x) == pWARN_STD || (x) == pWARN_ALL ||        \
                                 (x) == pWARN_NONE)