From patchwork Sat Apr 7 21:58:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joey Pabalinas X-Patchwork-Id: 10328027 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 E9ADF6038F for ; Sat, 7 Apr 2018 21:58:21 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C6B8E29228 for ; Sat, 7 Apr 2018 21:58:21 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BB74A2922E; Sat, 7 Apr 2018 21:58:21 +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=-5.0 required=2.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, FSL_HELO_FAKE, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID,T_TVD_MIME_EPI 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 C502E29228 for ; Sat, 7 Apr 2018 21:58:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752156AbeDGV6T (ORCPT ); Sat, 7 Apr 2018 17:58:19 -0400 Received: from mail-pl0-f67.google.com ([209.85.160.67]:39221 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752068AbeDGV6S (ORCPT ); Sat, 7 Apr 2018 17:58:18 -0400 Received: by mail-pl0-f67.google.com with SMTP id e7-v6so773482plt.6; Sat, 07 Apr 2018 14:58:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:mime-version:content-disposition :user-agent; bh=RtI1lsVhMQLQOS90fsqz5JxHKuHdqd51iLAPKhi3fIU=; b=ARgPWwjsFi8+2rIRTYEFg83XMTFjTpp3AsUOLiV2l+wn9XHiO+ga+oOHoyWPLKk8sU PAuLa3+1STO0g+cYCZHrJOqjQksrMtyYRcvfwhWY6pPqusyXR6Xt1Z19UiZvgdaAATaa Vh6N++4o35AovfvTuppvhLF3zcifKFyFgJQUyr/FLUFTzRizuqNiWMpIRY9WpkoKpZpC wvxPZ6pbY1phteJWzfaS48aYdXMqY2Aa1E+EQLG4MpMU0Er9qUsfSDjYOd/kf1F10fXS 8KxgxdeooevxvofPkblN/TqDSLmnDN7n2C+8cJpdAS1JWSHlIGGK6WL0Y9e13SJsBGRO dp6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:user-agent; bh=RtI1lsVhMQLQOS90fsqz5JxHKuHdqd51iLAPKhi3fIU=; b=MkxQmlFLoZwpXujV+aul6uWKnRjtvROMtSZKnJObP/i0zOWf0XZSnuiE5Q7yYswEUC g+Ng7IMmVGYq3xoe8qV1EvsCghWvTi18uPNRgA8QmY/V7ls4P5mAVVmsBfjNsVEa016f ZBIC1nZI2Y69jSsb1qzOgnPPvyTYsc0ywWT2oC2eEjhZ4iBAgYmomAn+eL54yF06eW4Y 9xVcd0DsHKY0BYoH6Pdm+4Fp434m05F4rLj2q8bEeJ0fB1MlO+7Q5/wyhhujFUOawQuh qHj52DvuZN6zLU0bROaOb3XeSMcorXWKubARXXxjgEi2s6rbI+ojy8AlFKFG6W8cieWA rilA== X-Gm-Message-State: AElRT7GIK4EFUb2nX1IOgC5fx9o4Zj6bhbbUTNCxpzPFoSKu3ry14udq 7iG6GiRMvgvT4WieyIVSDTanDg== X-Google-Smtp-Source: AIpwx4/m+hLW4PJ1UFht4NUPmrFWH3tDsIOAnTqHlFSZWNd/h2uWyIoKWo6w2dOv/t7S1PFE6k3SxQ== X-Received: by 2002:a17:902:6103:: with SMTP id t3-v6mr32818480plj.76.1523138298182; Sat, 07 Apr 2018 14:58:18 -0700 (PDT) Received: from gmail.com (cpe-98-150-136-16.hawaii.res.rr.com. [98.150.136.16]) by smtp.gmail.com with ESMTPSA id p6sm26475924pfk.104.2018.04.07.14.58.16 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sat, 07 Apr 2018 14:58:17 -0700 (PDT) Date: Sat, 7 Apr 2018 11:58:05 -1000 From: Joey Pabalinas To: linux-sparse@vger.kernel.org Cc: Kees Cook , Linus Torvalds , Martin Uecker , Al Viro , Christopher Li , Linux Kernel Mailing List , Joey Pabalinas Subject: [PATCH v2] add -Wpointer-arith sparse flag to toggle sizeof(void) warnings Message-ID: <20180407215805.ze5rx4v3slbjngmo@gmail.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: NeoMutt/20180323 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 Recent changes to the min()/max() macros in include/linux/kernel.h have added a lot of noise when compiling the kernel with Sparse checking enabled. This mostly is due to the *huge* increase in the number of sizeof(void) warnings, a larger number of which can safely be ignored. Add the -Wpointer-arith flag to enable/disable these warnings (along with the warning when applying sizeof to function types exactly like the GCC -Wpointer-arith flag) on demand; the warning itself has been disabled by default to reduce the large influx of noise which was inadvertently added by commit 3c8ba0d61d04ced9f8 (kernel.h: Retain constant expression output for max()/min()). Update the manpage to document the new flag. CC: Kees Cook CC: Linus Torvalds CC: Martin Uecker CC: Al Viro CC: Christopher Li CC: Joey Pabalinas CC: Luc Van Oostenryck Signed-off-by: Joey Pabalinas Signed-off-by: Luc Van Oostenryck 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/evaluate.c b/evaluate.c index 4e1dffe9c5416380df..f828da37df8e686623 100644 --- a/evaluate.c +++ b/evaluate.c @@ -2193,7 +2193,8 @@ static struct symbol *evaluate_sizeof(struct expression *expr) size = type->bit_size; if (size < 0 && is_void_type(type)) { - warning(expr->pos, "expression using sizeof(void)"); + if (Wpointer_arith) + warning(expr->pos, "expression using sizeof(void)"); size = bits_in_char; } @@ -2204,7 +2205,8 @@ static struct symbol *evaluate_sizeof(struct expression *expr) } if (is_function(type->ctype.base_type)) { - warning(expr->pos, "expression using sizeof on a function"); + if (Wpointer_arith) + warning(expr->pos, "expression using sizeof on a function"); size = bits_in_char; } diff --git a/lib.c b/lib.c index 73d372c36626538bab..f7fdac96674aec4c24 100644 --- a/lib.c +++ b/lib.c @@ -242,6 +242,7 @@ int Woverride_init = 1; int Woverride_init_all = 0; int Woverride_init_whole_range = 0; int Wparen_string = 0; +int Wpointer_arith = 0; int Wptr_subtraction_blows = 0; int Wreturn_void = 0; int Wshadow = 0; @@ -654,6 +655,7 @@ static const struct flag warnings[] = { { "return-void", &Wreturn_void }, { "shadow", &Wshadow }, { "sizeof-bool", &Wsizeof_bool }, + { "pointer-arith", &Wpointer_arith }, { "sparse-error", &Wsparse_error }, { "tautological-compare", &Wtautological_compare }, { "transparent-union", &Wtransparent_union }, diff --git a/lib.h b/lib.h index 3050b5577ba4d42e97..e34bb9a02ebac03f52 100644 --- a/lib.h +++ b/lib.h @@ -151,6 +151,7 @@ extern int Woverride_init; extern int Woverride_init_all; extern int Woverride_init_whole_range; extern int Wparen_string; +extern int Wpointer_arith; extern int Wptr_subtraction_blows; extern int Wreturn_void; extern int Wshadow; diff --git a/sparse.1 b/sparse.1 index 88343f3170f195297a..4379406999c94b806e 100644 --- a/sparse.1 +++ b/sparse.1 @@ -288,6 +288,25 @@ Standard C syntax does not permit a parenthesized string as an array initializer. GCC allows this syntax as an extension. With \fB\-Wparen\-string\fR, Sparse will warn about this syntax. +Sparse does not issue these warnings by default. +. +.TP +.B \-Wpointer-arith +Warn about anything that depends on the \fBsizeof\fR a function type or of void. + +C99 does not allow the \fBsizeof\fR operator to be applied to function types or to +incomplete types such as void. GCC allows \fBsizeof\fR to be applied to these +types as an extension and assigns these types a size of \fI1\fR. + +Although non-standard (and somewhat illogical), constructs such as \fBsizeof(void)\fR +are often useful when the intent is to operate on an expression without evaluating +it, e.g. in the following integer constant expression predicate: + +.nf +#define __is_constexpr(x) \\ + (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8))) +.fi + Sparse does not issue these warnings by default. . .TP