Hi Martin! On 2021-07-09T17:11:25-0600, Martin Sebor via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > The attached tweak avoids the new -Warray-bounds instances when > building libatomic for arm. Christophe confirms it resolves > the problem (thank you!)
As Abid has just reported in <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101374#c16>, similar problem with GCN target libgomp build: In function ‘gcn_thrs’, inlined from ‘gomp_thread’ at [...]/source-gcc/libgomp/libgomp.h:803:10, inlined from ‘GOMP_barrier’ at [...]/source-gcc/libgomp/barrier.c:34:29: [...]/source-gcc/libgomp/libgomp.h:792:10: error: array subscript 0 is outside array bounds of ‘__lds struct gomp_thread * __lds[0]’ [-Werror=array-bounds] 792 | return *thrs; | ^~~~~ gcc/config/gcn/gcn.h: c_register_addr_space ("__lds", ADDR_SPACE_LDS); \ libgomp/libgomp.h-static inline struct gomp_thread *gcn_thrs (void) libgomp/libgomp.h-{ libgomp/libgomp.h- /* The value is at the bottom of LDS. */ libgomp/libgomp.h: struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4; libgomp/libgomp.h- return *thrs; libgomp/libgomp.h-} ..., plus a few more. Work-around: struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4; +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Warray-bounds" return *thrs; +# pragma GCC diagnostic pop ..., but it's a bit tedious to add that in all that the other places, too. (So I'll consider some GCN-specific '-Wno-array-bounds' if we don't get to resolve this otherwise, soon.) > As we have discussed, the main goal of this class of warnings > is to detect accesses at addresses derived from null pointers > (e.g., to struct members or array elements at a nonzero offset). (ACK, and thanks for that work!) > Diagnosing accesses at hardcoded addresses is incidental because > at the stage they are detected the two are not distinguishable > from each another. > > I'm planning (hoping) to implement detection of invalid pointer > arithmetic involving null for GCC 12, so this patch is a stopgap > solution to unblock the arm libatomic build without compromising > the warning. Once the new detection is in place these workarounds > can be removed or replaced with something more appropriate (e.g., > declaring the objects at the hardwired addresses with an attribute > like AVR's address or io; that would enable bounds checking at > those addresses as well). Of course, we may simply re-work the libgomp/GCN code -- but don't we first need to answer the question whether the current code is actually "bad"? Aren't we going to get a lot of similar reports from kernel/embedded/other low-level software developers, once this is out in the wild? I mean: > PR bootstrap/101379 - libatomic arm build failure after r12-2132 due to > -Warray-bounds on a constant address > > libatomic/ChangeLog: > * /config/linux/arm/host-config.h (__kernel_helper_version): New > function. Adjust shadow macro. > > diff --git a/libatomic/config/linux/arm/host-config.h > b/libatomic/config/linux/arm/host-config.h > index 1520f237d73..777d08a2b85 100644 > --- a/libatomic/config/linux/arm/host-config.h > +++ b/libatomic/config/linux/arm/host-config.h > @@ -39,8 +39,14 @@ typedef void (__kernel_dmb_t) (void); > #define __kernel_dmb (*(__kernel_dmb_t *) 0xffff0fa0) > > /* Kernel helper page version number. */ > -#define __kernel_helper_version (*(unsigned int *)0xffff0ffc) Are such (not un-common) '#define's actually "bad", and anyhow ought to be replaced by something like the following? > +static inline unsigned* > +__kernel_helper_version () > +{ > + unsigned *volatile addr = (unsigned int *)0xffff0ffc; > + return addr; > +} > > +#define __kernel_helper_version (*__kernel_helper_version()) (No 'volatile' in the original code, by the way.) Grüße Thomas ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955