From patchwork Thu Jun 28 23:21:20 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luc Van Oostenryck X-Patchwork-Id: 10495343 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 71B97601BE for ; Thu, 28 Jun 2018 23:21:26 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 5D4E5295F1 for ; Thu, 28 Jun 2018 23:21:26 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5076C2A0E2; Thu, 28 Jun 2018 23:21:26 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, FREEMAIL_FROM, MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9920C295F1 for ; Thu, 28 Jun 2018 23:21:25 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BC47A6B0007; Thu, 28 Jun 2018 19:21:24 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id B4C006B0008; Thu, 28 Jun 2018 19:21:24 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9ED396B000A; Thu, 28 Jun 2018 19:21:24 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) by kanga.kvack.org (Postfix) with ESMTP id 3D0716B0007 for ; Thu, 28 Jun 2018 19:21:24 -0400 (EDT) Received: by mail-ed1-f72.google.com with SMTP id c20-v6so2462188eds.21 for ; Thu, 28 Jun 2018 16:21:24 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:date:from:to:cc:subject :message-id:references:mime-version:content-disposition:in-reply-to :user-agent; bh=afXq2aPv2B3MzZ3D5CMcFffuyIH8CG7CNLmnWRAl9fw=; b=uYDi3OlpEbw8RalgmfiPcHgC9VifOY7BYtkobDH3x4G8FECbZ1LbVPoNEWOjmuA6Z0 oEpdM3Y/H1mFUp6BmAijIsoXOUSMn7GokdflLLD9S9p//HNdj0FNqHvawMcgDX25IFVI BOz0w6JV0FBTl2qOvW2wplo1VK/wBlTHY6HaIJ+WGPPMFeCnt4HEBP1svLb9YrYdaIk+ 3Lw+5xL+HEOcpqIhURTSspjJXwkfzjcWsXVeb13kDL3FTnJ3FAvoe5TaHiGUiT2z2+zg 9ETTcARbTx1S9doh/QxZs/wNXwTNDcVRdWVJO2TPalGQPZ3vGN2c2hkDZSjMTJg59kfP f0DQ== X-Gm-Message-State: APt69E3MMAEWk2ku+JLmG+UnyTqo3yOvh+a9cbgifZuiDxgbKqMCIzxc z5cPz/h0dsAaXe/T4ZzG41HHxEj6h8GrmOXqR72IikEwtfZ6xWF6hXrS3SrcxE+vtXBs5Kij2wU tILS8xuelwFCMoaqHEViUh+b7/d9+Ww6KLEp6RXL1aQZlxwZ00WQ+/Gp4zfV9d534jxznC9T4Ka XS+/8H154KwXDBugW02qkU/aAjiHsD3F6x7EpMlXeknIZVtBhbiHzwPm8wR05YzZ1o5XNKLRn7F HXddmHx/qUM+Axml2B0Yg+cn5P+LdklpsF3Hgsqmv1eC+T6JHPhDi96pVSWo+vIArfd290IRToS yiMNYYzIQg0oV13TIRYzmAheEA9747qMmKGD2Nzi4BwtbAc++352gm6OkYT2M1AWc0JQDQGIhI7 K X-Received: by 2002:a50:86f6:: with SMTP id 51-v6mr10511738edu.312.1530228083746; Thu, 28 Jun 2018 16:21:23 -0700 (PDT) X-Received: by 2002:a50:86f6:: with SMTP id 51-v6mr10511710edu.312.1530228082793; Thu, 28 Jun 2018 16:21:22 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530228082; cv=none; d=google.com; s=arc-20160816; b=T2A4bwZzy0jcSrW6w6C7Wy+B3GmBUg+esU4nuLUoQXM3aIk5L7jAOZzypAySqnZFD5 eKkZjzh60nXS4fUVjWsjXDT1WI5cUYjxe2GmpFLKcZFyNhB3qHRR03frVsHPy3DPJ6P8 sE1QhA7loC7GNBL35xwhxrsDpNYrJRR6KASB0F1HSiOgxorkpE6UxNcA9Ro7UdxadWq2 AbUc4tkBC8PKg/33W5VcMpmzqLyefUTQRiJ+o7xjZT00SEvHCAkXx7CdcDTGpJInmHyx x+4e+tmBns0zU/4iE4cEluXVYCJpHsfZvIGkwUTnmNg2K3tBOez3nu1UrSaJf2EoaEBs I3jQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=user-agent:in-reply-to:content-disposition:mime-version:references :message-id:subject:cc:to:from:date:dkim-signature :arc-authentication-results; bh=afXq2aPv2B3MzZ3D5CMcFffuyIH8CG7CNLmnWRAl9fw=; b=ahmNUz1wWtpoZ8ti9CmvdNqFAzvPb879IthUX/BhgDa4wh6DqhTreLl51053tesNH1 niLoRzDoZlCMESIxNCwAgxwn+5323J95Hicqjb8hGTGicScnZhdu1qbSpEtXrwTxdQOT FkjsjUiYy2Iv1oUjpCxaF42Hs5bVSpY2vgYm5uEALn461Dr2cl1Okpd3kuJEBzqVU9Yg XuNWC1l2pFmxVimcpwszfwF1GEUKAIYS6TLH+f5mt7jNDRqBNg0JjjkMsy6hUAaVcKaW /lsPPQzZvxPeAgZedNh0YamQv9wqKr4+sGxGxwI//SAqzju3ZKsTOzV7guzComzjnqTI Tmmg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ejd6ElVv; spf=pass (google.com: domain of luc.vanoostenryck@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=luc.vanoostenryck@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id m1-v6sor3507703eds.47.2018.06.28.16.21.22 for (Google Transport Security); Thu, 28 Jun 2018 16:21:22 -0700 (PDT) Received-SPF: pass (google.com: domain of luc.vanoostenryck@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ejd6ElVv; spf=pass (google.com: domain of luc.vanoostenryck@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=luc.vanoostenryck@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=afXq2aPv2B3MzZ3D5CMcFffuyIH8CG7CNLmnWRAl9fw=; b=ejd6ElVvCipsxSWm6qlewdixNBcU/QLTjo9yHO8dLRV75bTHJJcx31V3m40PPCGIc9 sMGTtJ9E6lwXQpZc1R+KxHfUwDa4YV4abXV8vzoP+p4WmNz+HkzweQdDpEScsvLvwAYQ z8/yLG90U8D01gczXmwXhrer2y7Kfxf/iUVED1dotD0YAmc4N8uLCRWx2zR6Cftrmvz4 UZYzd1Bh6rVWTUTSqtDWTrbUAMiHc9pNkvX+xZSB1jOHxXvw//yKLlqj8TrPOqi4G/5j 8dVwgipifzvc0b0GWSIoBeeoeU5I4AK0+3Xr1t35Z0hFMMrQPWwXxe28YGkbmwx+bv9J RdYw== X-Google-Smtp-Source: AAOMgpdBoq6+5FtqzCFhHl0g5i0C9BIzNWVuhy4PvMKiwyRPXeO65ofzTyjU3kSMeZ4ZYoBTnTzzWw== X-Received: by 2002:aa7:c0c9:: with SMTP id j9-v6mr10824645edp.135.1530228082448; Thu, 28 Jun 2018 16:21:22 -0700 (PDT) Received: from ltop.local ([2a02:a03f:40dc:3d00:7d3e:ff9f:2e8:f5a5]) by smtp.gmail.com with ESMTPSA id w17-v6sm3361284edr.30.2018.06.28.16.21.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Jun 2018 16:21:21 -0700 (PDT) Date: Fri, 29 Jun 2018 01:21:20 +0200 From: Luc Van Oostenryck To: Catalin Marinas Cc: Mark Rutland , Kate Stewart , "linux-doc@vger.kernel.org" , Will Deacon , Kostya Serebryany , "linux-kselftest@vger.kernel.org" , Chintan Pandya , Shuah Khan , Ingo Molnar , "linux-arch@vger.kernel.org" , Jacob Bramley , Dmitry Vyukov , Evgeniy Stepanov , Kees Cook , Ruben Ayrapetyan , Andrey Konovalov , Lee Smith , Al Viro , nd , Linux ARM , Linux Memory Management List , Greg Kroah-Hartman , LKML , Ramana Radhakrishnan , Andrew Morton , Robin Murphy , "Kirill A . Shutemov" , linux-sparse@vger.kernel.org Subject: [PATCH] sparse: stricter warning for explicit cast to ulong Message-ID: <20180628232119.5jaavhewv5nb6ufb@ltop.local> References: <20180626172900.ufclp2pfrhwkxjco@armageddon.cambridge.arm.com> <0cef1643-a523-98e7-95e2-9ec595137642@arm.com> <20180627171757.amucnh5znld45cpc@armageddon.cambridge.arm.com> <20180628061758.j6bytsaj5jk4aocg@ltop.local> <20180628102741.vk6vphfinlj3lvhv@armageddon.cambridge.arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20180628102741.vk6vphfinlj3lvhv@armageddon.cambridge.arm.com> User-Agent: NeoMutt/20180622 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP sparse issues a warning when user pointers are casted to integer types except to unsigned longs which are explicitly allowed. However it may happen that we would like to also be warned on casts to unsigned long. Fix this by adding a new warning flag: -Wcast-from-as (to mirrors -Wcast-to-as) which extends -Waddress-space to all casts that remove an address space attribute (without using __force). References: https://lore.kernel.org/lkml/20180628102741.vk6vphfinlj3lvhv@armageddon.cambridge.arm.com/ Signed-off-by: Luc Van Oostenryck --- This patch is available in the Git repository at: git://github.com/lucvoo/sparse-dev.git warn-cast-from-as ---------------------------------------------------------------- Luc Van Oostenryck (1): stricter warning for explicit cast to ulong evaluate.c | 4 +-- lib.c | 2 ++ lib.h | 1 + sparse.1 | 9 ++++++ validation/Waddress-space-strict.c | 56 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 validation/Waddress-space-strict.c diff --git a/evaluate.c b/evaluate.c index 194b97218..64e1067ce 100644 --- a/evaluate.c +++ b/evaluate.c @@ -2998,14 +2998,14 @@ static struct symbol *evaluate_cast(struct expression *expr) } } - if (ttype == &ulong_ctype) + if (ttype == &ulong_ctype && !Wcast_from_as) tas = -1; else if (tclass == TYPE_PTR) { examine_pointer_target(ttype); tas = ttype->ctype.as; } - if (stype == &ulong_ctype) + if (stype == &ulong_ctype && !Wcast_from_as) sas = -1; else if (sclass == TYPE_PTR) { examine_pointer_target(stype); diff --git a/lib.c b/lib.c index 308f8f699..0bb5232ab 100644 --- a/lib.c +++ b/lib.c @@ -248,6 +248,7 @@ static struct token *pre_buffer_end = NULL; int Waddress = 0; int Waddress_space = 1; int Wbitwise = 1; +int Wcast_from_as = 0; int Wcast_to_as = 0; int Wcast_truncate = 1; int Wconstexpr_not_const = 0; @@ -678,6 +679,7 @@ static const struct flag warnings[] = { { "address", &Waddress }, { "address-space", &Waddress_space }, { "bitwise", &Wbitwise }, + { "cast-from-as", &Wcast_from_as }, { "cast-to-as", &Wcast_to_as }, { "cast-truncate", &Wcast_truncate }, { "constexpr-not-const", &Wconstexpr_not_const}, diff --git a/lib.h b/lib.h index b0453bb6e..46e685421 100644 --- a/lib.h +++ b/lib.h @@ -137,6 +137,7 @@ extern int preprocess_only; extern int Waddress; extern int Waddress_space; extern int Wbitwise; +extern int Wcast_from_as; extern int Wcast_to_as; extern int Wcast_truncate; extern int Wconstexpr_not_const; diff --git a/sparse.1 b/sparse.1 index 806fb0cf0..62956f18b 100644 --- a/sparse.1 +++ b/sparse.1 @@ -77,6 +77,15 @@ Sparse issues these warnings by default. To turn them off, use \fB\-Wno\-bitwise\fR. . .TP +.B \-Wcast\-from\-as +Warn about which remove an address space to a pointer type. + +This is similar to \fB\-Waddress\-space\fR but will also warn +on casts to \fBunsigned long\fR. + +Sparse does not issues these warnings by default. +. +.TP .B \-Wcast\-to\-as Warn about casts which add an address space to a pointer type. diff --git a/validation/Waddress-space-strict.c b/validation/Waddress-space-strict.c new file mode 100644 index 000000000..ad23f74ae --- /dev/null +++ b/validation/Waddress-space-strict.c @@ -0,0 +1,56 @@ +#define __user __attribute__((address_space(1))) + +typedef unsigned long ulong; +typedef long long llong; +typedef struct s obj_t; + +static void expl(int i, ulong u, llong l, void *v, obj_t *o, obj_t __user *p) +{ + (obj_t*)(i); + (obj_t __user*)(i); + + (obj_t*)(u); + (obj_t __user*)(u); + + (obj_t*)(l); + (obj_t __user*)(l); + + (obj_t*)(v); + (obj_t __user*)(v); + + (int)(o); + (ulong)(o); + (llong)(o); + (void *)(o); + (obj_t*)(o); + (obj_t __user*)(o); + + (int)(p); // w + (ulong)(p); // w! + (llong)(p); // w + (void *)(p); // w + (obj_t*)(p); // w + (obj_t __user*)(p); // ok +} + +/* + * check-name: Waddress-space-strict + * check-command: sparse -Wcast-from-as -Wcast-to-as $file + * + * check-error-start +Waddress-space-strict.c:10:10: warning: cast adds address space to expression () +Waddress-space-strict.c:13:10: warning: cast adds address space to expression () +Waddress-space-strict.c:16:10: warning: cast adds address space to expression () +Waddress-space-strict.c:19:10: warning: cast adds address space to expression () +Waddress-space-strict.c:26:10: warning: cast adds address space to expression () +Waddress-space-strict.c:28:10: warning: cast removes address space of expression +Waddress-space-strict.c:29:10: warning: cast removes address space of expression +Waddress-space-strict.c:30:10: warning: cast removes address space of expression +Waddress-space-strict.c:31:10: warning: cast removes address space of expression +Waddress-space-strict.c:32:10: warning: cast removes address space of expression +Waddress-space-strict.c:9:10: warning: non size-preserving integer to pointer cast +Waddress-space-strict.c:10:10: warning: non size-preserving integer to pointer cast +Waddress-space-strict.c:21:10: warning: non size-preserving pointer to integer cast +Waddress-space-strict.c:28:10: warning: non size-preserving pointer to integer cast + * check-error-end + */