From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qk1-x72c.google.com (mail-qk1-x72c.google.com [IPv6:2607:f8b0:4864:20::72c]) by sourceware.org (Postfix) with ESMTPS id 063AD385800F for ; Fri, 16 Jul 2021 21:11:27 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 063AD385800F Received: by mail-qk1-x72c.google.com with SMTP id c68so5363984qkf.9 for ; Fri, 16 Jul 2021 14:11:27 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=JgWD1huTFTntzqjZ9HJ3nVvq5RV6K7w/Yx/fmaGzSD8=; b=tTWDYNy0drll0XyaQpn0S3gLSosOuDVJYzxy0xSIVdlgpyC7y6+mF6pNN3girKE4nx UzZJEnNziLTlKpqNPG03ZkyptvzvUE/yCqtu+Bbr+RkiAQRY/SJcflIrKBqh3yDZdAKb XZM8DnvmNsT5fru4j6VBlWTewxf0ApPVu9po7XzqEt4qOTC2uvH2tNkok+jbQZI2uY+k zS6+SoHdTvQOjLWtemmdEKenhzM3/TqsSOC+sIkpeDrQP0NrT48hRC3Uq/mI/vN56f6b NR7lHTiwncGukt11/KbF6gznjMkTADtSd7QQuQlTsoEKJeP7OWYyWQNBegLtVSxX70rx gzJw== X-Gm-Message-State: AOAM531Gb8TO4WGcL9cXsi6QO8TpVkLBPF0/wamijXNxuDgLZP54mNGu fCgy6WmFnzoy99EUuS9xAV0= X-Google-Smtp-Source: ABdhPJz7PqVN2QsAjDrO06L7HMq8PLd5bEqwFTj+1v9CIGFfpNdh1314R9idGN6Ij+zX/fLm/CTnOg== X-Received: by 2002:a37:9a47:: with SMTP id c68mr7790056qke.37.1626469886590; Fri, 16 Jul 2021 14:11:26 -0700 (PDT) Received: from [192.168.0.41] (75-166-102-22.hlrn.qwest.net. [75.166.102.22]) by smtp.gmail.com with ESMTPSA id bm24sm4225614qkb.47.2021.07.16.14.11.25 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 16 Jul 2021 14:11:26 -0700 (PDT) Subject: Re: [PATCH libatomic/arm] avoid warning on constant addresses (PR 101379) To: Thomas Schwinge Cc: gcc-patches@gcc.gnu.org, Christophe Lyon , Hafiz Abid Qadeer , Andrew Stubbs References: <816ce216-bf6a-75ca-4241-4861ec43ab27@gmail.com> <87pmvii29w.fsf@euler.schwinge.homeip.net> From: Martin Sebor Message-ID: <1ab598da-6cac-c1bd-b54f-4f5c8b0683f6@gmail.com> Date: Fri, 16 Jul 2021 15:11:24 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 In-Reply-To: <87pmvii29w.fsf@euler.schwinge.homeip.net> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.2 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 16 Jul 2021 21:11:28 -0000 On 7/16/21 11:42 AM, Thomas Schwinge wrote: > Hi Martin! > > On 2021-07-09T17:11:25-0600, Martin Sebor via Gcc-patches 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 > , 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? Like all warnings (and especially flow-based ones that depend on optimization), this one too involves a trade-off between noise and real bugs. There clearly is some low-level code that intentionally accesses memory at hardcoded addresses. But because null pointers are pervasive, there's a lot more code that could end up accessing data at some offset from zero by accident (e.g., by writing to an array element or a member of a struct). This affects all code, but is an especially big concern for privileged code that can access all memory. So in my view, the trade-off is worthwhile. The logic the warning relies on isn't new: it was introduced in GCC 11. There have been a handful of reports of this issue (some from the kernel) but far fewer than in other warnings. The recent change expose more code to the logic so the numbers of both false and true positives are bound to go up, in proportion. Hopefully, before GCC 12 is released, I will have a more robust solution to the null+offset problem. > >> +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.) The volatile is what prevents the warning. But I think a better solution than the hack above is to introduce a named extern const variable for the address. It avoids the issue without the penalty of multiple volatile accesses and if/when an attribute like AVR address is introduced it can be more easily adapted to it. Real object declarations with an attribute is also a more appropriate mechanism than using hardcoded address in pointers. Martin