Re: Bug-report: Smatch treats scoped_guard() as unreachable code ?

Harshit Mogalapalli <[email protected]> Tue, 20 Aug 2024 01:07:58 +0530
Newsgroups org.kernel.vger.smatch
Message-ID <[email protected]>
On 20/08/24 00:59, Dan Carpenter wrote:
> On Tue, Aug 20, 2024 at 12:38:21AM +0530, Harshit Mogalapalli wrote:
>> Hey Dan,
>>
>> I have noticed some warnings which mark scoped_guard() as unreachable code
>> on today's next.
>>
>> drivers/platform/x86/ideapad-laptop.c:856 dytc_profile_set() warn: ignoring
>> unreachable code.
>>
> 
> drivers/platform/x86/ideapad-laptop.c
>     848  static int dytc_profile_set(struct platform_profile_handler *pprof,
>     849                              enum platform_profile_option profile)
>     850  {
>     851          struct ideapad_dytc_priv *dytc = container_of(pprof, struct ideapad_dytc_priv, pprof);
>     852          struct ideapad_private *priv = dytc->priv;
>     853          unsigned long output;
>     854          int err;
>     855
>     856          scoped_guard(mutex_intr, &dytc->mutex) {
> 
> scoped_guard is actually a for loop that iterates one time.  So the post-op
> expression isn't reachable because to the return 0;  This seems like it might
> be a common false positive.
> 
> Add it to smatch_data/kernel.unreachable.ignore.  Except...  Ugh, I already did
> but haven't committed it yet.  I'll do that.
> 
>     857                  if (profile == PLATFORM_PROFILE_BALANCED) {
>     858                          /* To get back to balanced mode we just issue a reset command */
>     859                          err = eval_dytc(priv->adev->handle, DYTC_CMD_RESET, NULL);
>     860                          if (err)
>     861                                  return err;
>     862                  } else {
>     863                          int perfmode;
>     864
>     865                          err = convert_profile_to_dytc(profile, &perfmode);
>     866                          if (err)
>     867                                  return err;
>     868
>     869                          /* Determine if we are in CQL mode. This alters the commands we do */
>     870                          err = dytc_cql_command(priv,
>     871                                                 DYTC_SET_COMMAND(DYTC_FUNCTION_MMC, perfmode, 1),
>     872                                                 &output);
>     873                          if (err)
>     874                                  return err;
>     875                  }
>     876
>     877                  /* Success - update current profile */
>     878                  dytc->current_profile = profile;
>     879                  return 0;
>     880          }
>     881
>     882          return -EINTR;
>     883  }
> 
> 
>> drivers/input/touchscreen/wacom_w8001.c:383 w8001_open() warn: ignoring
>> unreachable code.
> 
> This one is the same.
> 
> Pushed.

Thanks for explaining and pushing the code Dan!

Harshit