diff options
author | Karl Williamson <khw@cpan.org> | 2018-12-30 21:29:07 -0700 |
---|---|---|
committer | Karl Williamson <khw@cpan.org> | 2019-01-05 10:42:26 -0700 |
commit | 8c165a32b7cc4f2a147a37c920a96f1b09b2386d (patch) | |
tree | 86b73c56af6a273a3985db49330d31068995f692 | |
parent | 81f816b3b4c1f7193f4c870874ef3879c690373f (diff) | |
download | perl-8c165a32b7cc4f2a147a37c920a96f1b09b2386d.tar.gz |
regen/warnings.pl: Fix undefined C behavior
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.
-rw-r--r-- | globvar.sym | 2 | ||||
-rw-r--r-- | perl.h | 5 | ||||
-rw-r--r-- | regen/warnings.pl | 4 | ||||
-rw-r--r-- | warnings.h | 4 |
4 files changed, 11 insertions, 4 deletions
diff --git a/globvar.sym b/globvar.sym index 6fb387ca0a..476f4ca095 100644 --- a/globvar.sym +++ b/globvar.sym @@ -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 @@ -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[] diff --git a/regen/warnings.pl b/regen/warnings.pl index 9c01e6762f..d244160b3e 100644 --- a/regen/warnings.pl +++ b/regen/warnings.pl @@ -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) diff --git a/warnings.h b/warnings.h index e0c12ed403..58f52272de 100644 --- a/warnings.h +++ b/warnings.h @@ -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) |