On 20/07/2026 14:59, Torbjorn SVENSSON wrote: > > > On 2026-07-20 15:18, Richard Earnshaw (foss) wrote: >> On 15/07/2026 06:04, Torbjörn SVENSSON wrote: >>> Hi Richard, >>> >>> I've updated to your sugestion, but used exit(0) instead of _exit(0) as >>> 'exit' is defined in the stdlib.h header file, while '_exit' is not. >>> If we use '_exit', we need to have a function prototype too. >>> Including stdlib.h, or stddef.h, is required for 'NULL' regardless. >>> >>> Ok for trunk, releases/gcc-16 and releases/gcc-15? >>> >> >> Hmm, actually I think we should use __builtin_exit(), so we don't need to >> declare it. This saves a lot of >> header pre-processing when compiling the test as now we no-longer need >> stddef.h. Many tests call __builtin_abort() rather than abort() for the >> same reason. >> >> But equally, I suspect we could just return 0 from main and let the normal >> program termination code handle the exit code that way. >> >> Either way avoids the need to include stddef.h. > > I ended up with `return 0;`. Note, I also changed `read_mem (NULL);` to > `read_mem (0);` to get rid of the include. >
read_mem ((char *)0); is arguably better since conversion from int to pointer can generate warnings in some instances. I guess we get away with it here because we're at -O0 and warnings have been left off. R. >> OK with one or other of those changes. > > Pushed as r17-2559-g2e26607f7f14bd, r16-9314-g307954e9c03aba and > r15-11398-gcf69dd0145e174. > > Kind regards, > Torbjörn > >> >> R. >> >>> Kind regards, >>> Torbjörn >>> -- >>> >>> As arm-none-eabi targets might have readable memory at address 0, >>> g++.dg/torture/pr101373.C test will "work" on some targets, while others >>> might tigger a fault. To avoid the ambiguity, lest skip the test if >>> target allows null to be dereferenced. >>> >>> PR testsuite/126261 >>> >>> gcc/ChangeLog: >>> >>> * doc/sourcebuild.texi (can_deref_null): Document. >>> >>> gcc/testsuite/ChangeLog: >>> >>> * g++.dg/torture/pr101373.C: Use effective-target can_deref_null. >>> * lib/target-supports.exp (check_effective_target_can_deref_null): >>> New proc. >>> >>> Signed-off-by: Torbjörn SVENSSON <[email protected]> >>> --- >>> gcc/doc/sourcebuild.texi | 4 ++++ >>> gcc/testsuite/g++.dg/torture/pr101373.C | 1 + >>> gcc/testsuite/lib/target-supports.exp | 21 +++++++++++++++++++++ >>> 3 files changed, 26 insertions(+) >>> >>> diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi >>> index 0e08ef5e645..e2530cf159d 100644 >>> --- a/gcc/doc/sourcebuild.texi >>> +++ b/gcc/doc/sourcebuild.texi >>> @@ -2739,6 +2739,10 @@ Target supports the execution of @code{amx-movrs} >>> instructions. >>> @item amx_fp8 >>> Target supports the execution of @code{amx-fp8} instructions. >>> +@item can_deref_null >>> +Target runtime permits dereferencing a null pointer without trapping, for >>> +example because address zero is mapped and readable. >>> + >>> @item cell_hw >>> Test system can execute AltiVec and Cell PPU instructions. >>> diff --git a/gcc/testsuite/g++.dg/torture/pr101373.C >>> b/gcc/testsuite/g++.dg/torture/pr101373.C >>> index f8c809739e2..45f1e455eec 100644 >>> --- a/gcc/testsuite/g++.dg/torture/pr101373.C >>> +++ b/gcc/testsuite/g++.dg/torture/pr101373.C >>> @@ -1,5 +1,6 @@ >>> // { dg-do run } >>> // { dg-xfail-run-if "PR100409" { *-*-* } } >>> +// { dg-skip-if "PR126261" { can_deref_null } } >>> int __attribute__((const,noipa)) foo (int j) >>> { >>> diff --git a/gcc/testsuite/lib/target-supports.exp >>> b/gcc/testsuite/lib/target-supports.exp >>> index edd1290bd9e..9e4966cff0f 100644 >>> --- a/gcc/testsuite/lib/target-supports.exp >>> +++ b/gcc/testsuite/lib/target-supports.exp >>> @@ -15134,3 +15134,24 @@ proc check_effective_target_memtag_exec {} { >>> } >>> return 1; >>> } >>> + >>> +# Return 1 if the target runtime can deref null, 0 otherwise. >>> +# Cache the result. >>> + >>> +proc check_effective_target_can_deref_null { } { >>> + return [check_runtime can_deref_null { >>> + #include <stdlib.h> >>> + char __attribute__((noipa)) >>> + read_mem (volatile char *p) >>> + { >>> + return *p; >>> + } >>> + >>> + int >>> + main () >>> + { >>> + read_mem (NULL); >>> + exit (0); >>> + } >>> + } "-O0 -fno-delete-null-pointer-checks -Wno-null-dereference"] >>> +} >> >
