From patchwork Sat Oct 9 18:43:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Sebor X-Patchwork-Id: 46033 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 917553858404 for ; Sat, 9 Oct 2021 18:44:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 917553858404 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1633805044; bh=4KqoZAlDxDjszlVE27OQXJ/M+MuPEf7VtwCjfdV40yk=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=Y6tnDU95JkKDADmviM/rjcT2+PPYqijyCeotvL9qPSMrrdjdSVYzf6x4w/8D9XLIv r0NMnYTyoPxx63F4WyIpszoXxnkqCxxIecBZX4K+RMccFnkTYFdyaFxfTaeLaZcRMS GJ+RXakChoOMMz/D7GP0xTJfa8IR4br7iTCGY6SY= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org 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 7C3C13858404 for ; Sat, 9 Oct 2021 18:43:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7C3C13858404 Received: by mail-qk1-x72c.google.com with SMTP id x12so12806350qkf.9 for ; Sat, 09 Oct 2021 11:43:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-language; bh=4KqoZAlDxDjszlVE27OQXJ/M+MuPEf7VtwCjfdV40yk=; b=0XqnevUpFfqVbWDWqTe0gfFK1cCPqnf6fr9aCBd+v8japZ1E6ZO4L92omkAmd/B4pO A/KDmKGVDb3t7X9S20Slw30IoeDQFcr76Iu+wJf2kWSnU+xjzKEosmBQc422C35DbyJd GJK5fsGrkizOmEQ1+RrurcGL3OTqCDli3RgYAHZCNGjUOL4PpaqZv7CHGbPCkZFEGspF O7lvXaSDabqKf/vwWD5UC+FyxXN36xtj82GXSkNO61t+vA+x+heSyACduXYqBPeAM45T 4uhxlHtl5Cz5ST7cYtBUNnEjOAkApe6GoThYiqqwJOilN1T7PvhQKWFruvF72aBKmNRn bT5w== X-Gm-Message-State: AOAM532qwGV9L6UUTv1oqBtZ4T/w6bXzQnEaeCgMU63v4So6iUvwqkyT q4XUlpHenOxP1lSwZbcAzIl3U+SGTgk= X-Google-Smtp-Source: ABdhPJwfyD7akKe6oa6mAmeCPHFhxEEm+tMRQBPWiUT6GoHkZflsy4ve5iKQG83uoG6v0NAdTQLQfg== X-Received: by 2002:ae9:ed02:: with SMTP id c2mr8249088qkg.117.1633805014044; Sat, 09 Oct 2021 11:43:34 -0700 (PDT) Received: from [192.168.0.41] (184-96-250-116.hlrn.qwest.net. [184.96.250.116]) by smtp.gmail.com with ESMTPSA id k10sm1805301qkk.124.2021.10.09.11.43.33 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 09 Oct 2021 11:43:33 -0700 (PDT) To: gcc-patches , "Joseph S. Myers" Subject: [PATCH] check to see if null pointer is dereferenceable [PR102630] Message-ID: <806cc630-86ef-2e3f-f72b-68bab2cd3e86@gmail.com> Date: Sat, 9 Oct 2021 12:43:32 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 Content-Language: en-US X-Spam-Status: No, score=-9.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, 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-Patchwork-Original-From: Martin Sebor via Gcc-patches From: Martin Sebor Reply-To: Martin Sebor Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" When determining the size of an object compute_objsize_r() assumes that addresses derived from null pointers are not derefernceable because null pointers themselves are not, without calling targetm.addr_space.zero_address_valid() to see if that assumption is supported for the pointer on the target. The attached change adds the missing call to avoid a spurious warning in Glibc that uses named address spaces to implement TLS on x86_64. Tested on x86_64-linux. Martin Check to see if null pointer is dereferenceable [PR102630]. Resolves: PR middle-end/102630 - Spurious -Warray-bounds with named address space gcc/ChangeLog: PR middle-end/102630 * pointer-query.cc (compute_objsize_r): Handle named address spaces. gcc/testsuite/ChangeLog: PR middle-end/102630 * gcc.dg/Warray-bounds-90.c: New test. diff --git a/gcc/pointer-query.cc b/gcc/pointer-query.cc index 83b1f0fc866..910f452868e 100644 --- a/gcc/pointer-query.cc +++ b/gcc/pointer-query.cc @@ -41,6 +41,7 @@ #include "pointer-query.h" #include "tree-pretty-print.h" #include "tree-ssanames.h" +#include "target.h" static bool compute_objsize_r (tree, int, access_ref *, ssa_name_limit_t &, pointer_query *); @@ -1869,13 +1870,24 @@ compute_objsize_r (tree ptr, int ostype, access_ref *pref, if (code == INTEGER_CST) { /* Pointer constants other than null are most likely the result - of erroneous null pointer addition/subtraction. Set size to - zero. For null pointers, set size to the maximum for now - since those may be the result of jump threading. */ + of erroneous null pointer addition/subtraction. Unless zero + is a valid address set size to zero. For null pointers, set + size to the maximum for now since those may be the result of + jump threading. */ if (integer_zerop (ptr)) pref->set_max_size_range (); + else if (POINTER_TYPE_P (TREE_TYPE (ptr))) + { + tree deref_type = TREE_TYPE (TREE_TYPE (ptr)); + addr_space_t as = TYPE_ADDR_SPACE (deref_type); + if (targetm.addr_space.zero_address_valid (as)) + pref->set_max_size_range (); + else + pref->sizrng[0] = pref->sizrng[1] = 0; + } else pref->sizrng[0] = pref->sizrng[1] = 0; + pref->ref = ptr; return true; diff --git a/gcc/testsuite/gcc.dg/Warray-bounds-90.c b/gcc/testsuite/gcc.dg/Warray-bounds-90.c new file mode 100644 index 00000000000..93461d4b238 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Warray-bounds-90.c @@ -0,0 +1,31 @@ +/* PR middle-end/102630 - spurious -Warray-bounds with named address space + { dg-do compile } + { dg-options "-O2 -Wall" } */ + +void sink (void*, ...); +#define sink(...) sink (0, __VA_ARGS__) + + +void test_generic_null (void) +{ + // We want some warning here but -Warray-bounds may not be it. + *(char*)0 = 0; // { dg-warning "" "pr??????" { xfail *-*-* } } +} + +void test_generic_cstaddr (void) +{ + /* We get -Warray-bounds (-Wstringop-overflow in GCC 11) but some + other warning might be preferable. */ + *(char*)1234 = 1; // { dg-warning "" } +} + + +void test_named_address_space_null (void) +{ + *(char __seg_fs*)0 = 0; // no warning (intentional) +} + +void test_named_address_space_cstaddr (void) +{ + *(char __seg_fs*)1234 = 0; // { dg-bogus "-Warray-bounds" } +}