From patchwork Thu May 11 16:21:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Luc Van Oostenryck X-Patchwork-Id: 9722425 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 7565560387 for ; Thu, 11 May 2017 16:23:01 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 6B76D286AD for ; Thu, 11 May 2017 16:23:01 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 60835286B8; Thu, 11 May 2017 16:23:01 +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=-6.3 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RCVD_IN_SORBS_SPAM, T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CA46B286B6 for ; Thu, 11 May 2017 16:23:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752112AbdEKQW6 (ORCPT ); Thu, 11 May 2017 12:22:58 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:34264 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752770AbdEKQV6 (ORCPT ); Thu, 11 May 2017 12:21:58 -0400 Received: by mail-wm0-f66.google.com with SMTP id d127so8116225wmf.1 for ; Thu, 11 May 2017 09:21:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=HFuiKSJgX3BySgd3QEmgFGiaL7cTt2iVHdoXlHDVNug=; b=mBhAiLwvWQQs5oE83Sswf43yhyRayv+PyiDJ439zo0IkbpkyBT8RTe8RozlCO9SxOM B2B8vSBuFhxjaKQ/evjMoX9tgaVMCI/cd4yTscUtWNhRef1RFEzfsYPalYBJeHXD8naE fCX1foCtaCqvG6yDVueCqZYAh+Am3+HCGL943pzXPTvsek46T0NuAh3qkTGr8rjGjeCi 6CzzVoynFZtvV403nfrXM4Q5PFoOebGoeYAARKr8As3sRVMZxt8p6A06F7noXaOsDHfq 4BMdP7NMWJ8NbX5EgFaF6K8MXaM/XlvWgNsAcnm5kv98Kxt5KSqZkHMrlIfhYdmBZzCd Dl4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=HFuiKSJgX3BySgd3QEmgFGiaL7cTt2iVHdoXlHDVNug=; b=QcQjtoI9E9NSKMwHlY2YQTKgGTyA/+hj9q/mAkuQRCzyEbopfhIgQWCm5773N842gS cyGEkXcxMAv+oXtnFPEK3YR8yA4x1D5briAruVqgAaPB3RL4IKvht1zrYO47gYWqe9Ke RM9S/4ntOOBrDZfLOHgiy1UaOPBr9VTVbkexkkegVWo0kQpU54Lzp6X8EP3pag0ratbr qP1SBc9pgQgL2QJmHEtrJ6LN4ae4CAFzr3qUPKd8lsunMqMVs0dzlhjW+ERUGpPmzjRo pHGRO2V22mJsvk64IKF88V6/1tQ52nS+QJe93AKYra77M7Pa7kxDE4ZA8A8rnEoIO5li 3cWA== X-Gm-Message-State: AODbwcAKDfqOklUGHFzI5mgLMNV1sYtfAdH92oM1/fRklfbsY3zK5jQm KvswqdFDf8vqCA== X-Received: by 10.28.13.1 with SMTP id 1mr1026093wmn.12.1494519717140; Thu, 11 May 2017 09:21:57 -0700 (PDT) Received: from localhost.localdomain ([2a02:a03f:88a:4600:6d44:dae3:7cc0:ebcc]) by smtp.gmail.com with ESMTPSA id w68sm672191wrb.49.2017.05.11.09.21.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 11 May 2017 09:21:56 -0700 (PDT) From: Luc Van Oostenryck To: Al Viro Cc: linux-sparse@vger.kernel.org, Pushkar Jambhlekar , Luc Van Oostenryck Subject: [PATCH] avoid useless warning for 'bool <- restricted type' conversion Date: Thu, 11 May 2017 18:21:27 +0200 Message-Id: <20170511162127.15692-1-luc.vanoostenryck@gmail.com> X-Mailer: git-send-email 2.12.2 In-Reply-To: <20170511060744.GJ390@ZenIV.linux.org.uk> References: <20170511060744.GJ390@ZenIV.linux.org.uk> Sender: linux-sparse-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sparse@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Conversion to bool is special in C since this conversion is essentially the result of the comparison with zero. As such, some operations which are normally unsafe to do with restricted types, like casting to an unrestricted type, are in fact safe to do when converting to bool and issuing a warning in those case is useless, confusing and causes people to add useless casts in the code in order to shut up the warning. Fix this by catching such 'bool <- restricted type' conversion and avoid such warnings. CC: Al Viro Originally-by: Al Viro Signed-off-by: Luc Van Oostenryck --- evaluate.c | 6 ++++++ validation/bool-cast-restricted.c | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 validation/bool-cast-restricted.c diff --git a/evaluate.c b/evaluate.c index 976857915..3dc26fc09 100644 --- a/evaluate.c +++ b/evaluate.c @@ -1345,6 +1345,12 @@ static int check_assignment_types(struct symbol *target, struct expression **rp, return 1; } else if (!(sclass & TYPE_RESTRICT)) goto Cast; + if (t == &bool_ctype) { + if (is_fouled_type(s)) + warning((*rp)->pos, "%s degrades to integer", + show_typename(s->ctype.base_type)); + goto Cast; + } *typediff = "different base types"; return 0; } diff --git a/validation/bool-cast-restricted.c b/validation/bool-cast-restricted.c new file mode 100644 index 000000000..f6776b050 --- /dev/null +++ b/validation/bool-cast-restricted.c @@ -0,0 +1,25 @@ +typedef unsigned int __attribute__((bitwise)) large_t; +#define LBIT ((__attribute__((force)) large_t) 1) + +_Bool lfoo(large_t x) { return x; } +_Bool lbar(large_t x) { return ~x; } +_Bool lbaz(large_t x) { return !x; } +_Bool lqux(large_t x) { return x & LBIT; } + + +typedef unsigned short __attribute__((bitwise)) small_t; +#define SBIT ((__attribute__((force)) small_t) 1) + +_Bool sfoo(small_t x) { return x; } +_Bool sbar(small_t x) { return ~x; } +_Bool sbaz(small_t x) { return !x; } +_Bool squx(small_t x) { return x & SBIT; } + +/* + * check-name: bool-cast-restricted.c + * check-command: sparse -Wno-decl $file + * + * check-error-start +bool-cast-restricted.c:14:32: warning: restricted small_t degrades to integer + * check-error-end + */