public inbox for linux-staging@lists.linux.dev
 help / color / mirror / Atom feed
From: Dan Carpenter <dan.carpenter@oracle.com>
To: "Fabio M. De Francesco" <fmdefrancesco@gmail.com>
Cc: Viresh Kumar <viresh.kumar@linaro.org>,
	linux-staging@lists.linux.dev, Viresh Kumar <vireshk@kernel.org>,
	Johan Hovold <johan@kernel.org>, Alex Elder <elder@kernel.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Subject: Re: drivers/staging/greybus/bootrom.c: fw is NULL but dereferenced
Date: Fri, 28 May 2021 13:42:29 +0300	[thread overview]
Message-ID: <20210528104229.GU1955@kadam> (raw)
In-Reply-To: <1931377.TGo55UGoA0@linux.local>

On Fri, May 28, 2021 at 10:03:52AM +0200, Fabio M. De Francesco wrote:
> On Friday, May 28, 2021 5:33:01 AM CEST Viresh Kumar wrote:
> > On 28-05-21, 01:39, Fabio M. De Francesco wrote:
> > > Coccinelle detected that fw is NULL but dereferenced.
> > > 
> > > static int gb_bootrom_get_firmware(struct gb_operation *op)
> > > {
> > > /* lines of code */
> > > 
> > >         if (!fw) {
> > >         
> > >                 dev_err(dev, "%s: firmware not available\n", __func__);
> > >                 ret = -EINVAL;
> > 
> > ret is set here.
> >
> Oh sorry. I entirely skipped that "ret = -EINVAL". Another case where one 
> should avoid blindly trusting the output of static analyzers without looking 
> carefully at the whole context ... :(
> 
> Unfortunately, Coccinelle has a high false positive rate. Just yesterday I ran 
> it against the entire driver / staging and more than 80% of the warnings / 
> errors weren't true.
> 
> It takes so long to distinguish the fake from the real that I wonder if it's 
> worth it to run the (slow) Coccinelle, wait for the output messages and verify 
> their veracity.

With static checkers, we are always targetting 100% false positive rate
because kernel devs fix the real bugs.

Smatch tracks the relationship between "ret" and "fw" so it knows that
"fw" is non-NULL and you could verify that by applying this diff and
running `smatch_scripts/kchecker drivers/staging/greybus/bootrom.c`

diff --git a/drivers/staging/greybus/bootrom.c b/drivers/staging/greybus/bootrom.c
index a8efb86de140..9976d1bac839 100644
--- a/drivers/staging/greybus/bootrom.c
+++ b/drivers/staging/greybus/bootrom.c
@@ -238,6 +238,7 @@ static int gb_bootrom_firmware_size_request(struct gb_operation *op)
 	return ret;
 }
 
+#include "/home/dcarpenter/progs/smatch/devel/check_debug.h"
 static int gb_bootrom_get_firmware(struct gb_operation *op)
 {
 	struct gb_bootrom *bootrom = gb_connection_get_data(op->connection);
@@ -298,6 +299,8 @@ static int gb_bootrom_get_firmware(struct gb_operation *op)
 
 queue_work:
 	/* Refresh timeout */
+	if (!ret)
+		__smatch_implied(fw);
 	if (!ret && (offset + size == fw->size))
 		next_request = NEXT_REQ_READY_TO_BOOT;
 	else

But this test for for potential NULL dereference has a very high false
positive rate so I seldom look at the output for it.  The problem is
that GCC used to complain about uninitialized variables and GCC had a
high false positive rate.  So just to make GCC be quiet, people would do
"fw = NULL;" when the code was too complicated for GCC to understand.
Then all the complicated code stopped being a GCC uninitialized variable
warning and became a static checker warning of dereferencing a NULL
pointer.  It's all the most complicated code to parse which does this
and so that's obviously going to be tricky.  You often need to know
outside context about how the function is called.

And it's tricky, not only for static checkers but also for humans as
well.  So when I'd review it, most of the time I couldn't really figure
out if it's a real bug so I'd have to just leave it.  #frustrating

regards,
dan carpenter

  reply	other threads:[~2021-05-28 10:42 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-27 23:39 drivers/staging/greybus/bootrom.c: fw is NULL but dereferenced Fabio M. De Francesco
2021-05-28  3:33 ` Viresh Kumar
2021-05-28  8:03   ` Fabio M. De Francesco
2021-05-28 10:42     ` Dan Carpenter [this message]
2021-05-28 10:29 ` Dan Carpenter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210528104229.GU1955@kadam \
    --to=dan.carpenter@oracle.com \
    --cc=elder@kernel.org \
    --cc=fmdefrancesco@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=johan@kernel.org \
    --cc=linux-staging@lists.linux.dev \
    --cc=viresh.kumar@linaro.org \
    --cc=vireshk@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox