diff mbox series

monitor: fix cases in switch in memory_dump

Message ID 20241030140656.36540-1-abelova@astralinux.ru (mailing list archive)
State New
Headers show
Series monitor: fix cases in switch in memory_dump | expand

Commit Message

Anastasia Belova Oct. 30, 2024, 2:06 p.m. UTC
default case has no condition. So if it is placed
higher that other cases, they are unreachable.

Move dafult case down.

Found by Linux Verification Center (linuxtesting.org)

Signed-off-by: Anastasia Belova <abelova@astralinux.ru>
---
 monitor/hmp-cmds-target.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Phil Dennis-Jordan Oct. 30, 2024, 7:03 p.m. UTC | #1
On Wed 30. Oct 2024 at 15:09, Anastasia Belova <abelova@astralinux.ru>
wrote:

> default case has no condition. So if it is placed
> higher that other cases, they are unreachable.
>
> Move dafult case down.
>

The stylistic merits might be debatable, but: the order of cases in a
switch block in C does not matter, the default case can appear anywhere.
The other cases are still reachable. So at minimum, the commit message is
incorrect.



> Found by Linux Verification Center (linuxtesting.org)
>
> Signed-off-by: Anastasia Belova <abelova@astralinux.ru>
> ---
>  monitor/hmp-cmds-target.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
> index ff01cf9d8d..eea8ca047b 100644
> --- a/monitor/hmp-cmds-target.c
> +++ b/monitor/hmp-cmds-target.c
> @@ -189,7 +189,6 @@ static void memory_dump(Monitor *mon, int count, int
> format, int wsize,
>          i = 0;
>          while (i < l) {
>              switch(wsize) {
> -            default:
>              case 1:
>                  v = ldub_p(buf + i);
>                  break;
> @@ -202,6 +201,9 @@ static void memory_dump(Monitor *mon, int count, int
> format, int wsize,
>              case 8:
>                  v = ldq_p(buf + i);
>                  break;
> +            default:
> +                v = ldub_p(buf + i);
> +                break;
>              }
>              monitor_printf(mon, " ");
>              switch(format) {
> --
> 2.47.0
>
>
>
Dr. David Alan Gilbert Oct. 31, 2024, 12:31 a.m. UTC | #2
* Phil Dennis-Jordan (lists@philjordan.eu) wrote:
> On Wed 30. Oct 2024 at 15:09, Anastasia Belova <abelova@astralinux.ru>
> wrote:
> 
> > default case has no condition. So if it is placed
> > higher that other cases, they are unreachable.
> >
> > Move dafult case down.
> >
> 
> The stylistic merits might be debatable, but: the order of cases in a
> switch block in C does not matter, the default case can appear anywhere.
> The other cases are still reachable. So at minimum, the commit message is
> incorrect.

I'd agree;  the analysis is wrong - it works as intended.
As for style, I'd normally agree that 'default' at end makes sense,
but:
  a) I hate duplicating code
  b) in a way this reads nicely:
                 default:
                 case 1:

      'default is the same as case 1'.

Dave

> 
> 
> > Found by Linux Verification Center (linuxtesting.org)
> >
> > Signed-off-by: Anastasia Belova <abelova@astralinux.ru>
> > ---
> >  monitor/hmp-cmds-target.c | 4 +++-
> >  1 file changed, 3 insertions(+), 1 deletion(-)
> >
> > diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
> > index ff01cf9d8d..eea8ca047b 100644
> > --- a/monitor/hmp-cmds-target.c
> > +++ b/monitor/hmp-cmds-target.c
> > @@ -189,7 +189,6 @@ static void memory_dump(Monitor *mon, int count, int
> > format, int wsize,
> >          i = 0;
> >          while (i < l) {
> >              switch(wsize) {
> > -            default:
> >              case 1:
> >                  v = ldub_p(buf + i);
> >                  break;
> > @@ -202,6 +201,9 @@ static void memory_dump(Monitor *mon, int count, int
> > format, int wsize,
> >              case 8:
> >                  v = ldq_p(buf + i);
> >                  break;
> > +            default:
> > +                v = ldub_p(buf + i);
> > +                break;
> >              }
> >              monitor_printf(mon, " ");
> >              switch(format) {
> > --
> > 2.47.0
> >
> >
> >
Peter Maydell Oct. 31, 2024, 10:52 a.m. UTC | #3
On Thu, 31 Oct 2024 at 00:32, Dr. David Alan Gilbert <dave@treblig.org> wrote:
>
> * Phil Dennis-Jordan (lists@philjordan.eu) wrote:
> > On Wed 30. Oct 2024 at 15:09, Anastasia Belova <abelova@astralinux.ru>
> > wrote:
> >
> > > default case has no condition. So if it is placed
> > > higher that other cases, they are unreachable.
> > >
> > > Move dafult case down.
> > >
> >
> > The stylistic merits might be debatable, but: the order of cases in a
> > switch block in C does not matter, the default case can appear anywhere.
> > The other cases are still reachable. So at minimum, the commit message is
> > incorrect.
>
> I'd agree;  the analysis is wrong - it works as intended.
> As for style, I'd normally agree that 'default' at end makes sense,
> but:
>   a) I hate duplicating code
>   b) in a way this reads nicely:
>                  default:
>                  case 1:
>
>       'default is the same as case 1'.

Is it actually possible to get here with a wsize that
isn't 1,2,4 or 8, though? This function is used only
by the hmp 'x' and 'xp' commands. Those document that
the valid size specifications are b, h, w or g (for
8, 16, 32 or 64 bits), and monitor_parse_arguments()
doesn't seem to have any undocumented handling that
would result in a different size value. And the
code in memory_dump() doesn't do anything sensible
with a wsize other than 1, 2, 4 or 8 -- if you hand
it a wsize of 3, for instance, I think it will print
every third byte.

So I think that probably the default case here should
be g_assert_not_reached().

Disclaimer: I haven't played with the x and xp commands
to confirm that we really don't ever get here with a
funny wsize value.

thanks
-- PMM
Peter Maydell Oct. 31, 2024, 11:26 a.m. UTC | #4
On Thu, 31 Oct 2024 at 10:52, Peter Maydell <peter.maydell@linaro.org> wrote:
>
> On Thu, 31 Oct 2024 at 00:32, Dr. David Alan Gilbert <dave@treblig.org> wrote:
> >
> > * Phil Dennis-Jordan (lists@philjordan.eu) wrote:
> > > On Wed 30. Oct 2024 at 15:09, Anastasia Belova <abelova@astralinux.ru>
> > > wrote:
> > >
> > > > default case has no condition. So if it is placed
> > > > higher that other cases, they are unreachable.
> > > >
> > > > Move dafult case down.
> > > >
> > >
> > > The stylistic merits might be debatable, but: the order of cases in a
> > > switch block in C does not matter, the default case can appear anywhere.
> > > The other cases are still reachable. So at minimum, the commit message is
> > > incorrect.
> >
> > I'd agree;  the analysis is wrong - it works as intended.
> > As for style, I'd normally agree that 'default' at end makes sense,
> > but:
> >   a) I hate duplicating code
> >   b) in a way this reads nicely:
> >                  default:
> >                  case 1:
> >
> >       'default is the same as case 1'.
>
> Is it actually possible to get here with a wsize that
> isn't 1,2,4 or 8, though? This function is used only
> by the hmp 'x' and 'xp' commands. Those document that
> the valid size specifications are b, h, w or g (for
> 8, 16, 32 or 64 bits), and monitor_parse_arguments()
> doesn't seem to have any undocumented handling that
> would result in a different size value. And the
> code in memory_dump() doesn't do anything sensible
> with a wsize other than 1, 2, 4 or 8 -- if you hand
> it a wsize of 3, for instance, I think it will print
> every third byte.
>
> So I think that probably the default case here should
> be g_assert_not_reached().

...better still, we could replace the whole switch(wsize)
with "v = ldn_p(buf + i, wsize);".

-- PMM
Anastasia Belova Oct. 31, 2024, 11:26 a.m. UTC | #5
> 30 окт. 2024 г., в 22:03, Phil Dennis-Jordan <lists@philjordan.eu> написал(а):
> 
> 
> On Wed 30. Oct 2024 at 15:09, Anastasia Belova <abelova@astralinux.ru> wrote:
> default case has no condition. So if it is placed
> higher that other cases, they are unreachable.
> 
> Move dafult case down.
> 
> The stylistic merits might be debatable, but: the order of cases in a switch block in C does not matter, the default case can appear anywhere. The other cases are still reachable. So at minimum, the commit message is incorrect.
> 

You’re right, I didn’t know about this. Thank you for reply and patience!

Anastasia Belova

> Found by Linux Verification Center (linuxtesting.org)
> 
> Signed-off-by: Anastasia Belova <abelova@astralinux.ru>
> ---
> monitor/hmp-cmds-target.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
> index ff01cf9d8d..eea8ca047b 100644
> --- a/monitor/hmp-cmds-target.c
> +++ b/monitor/hmp-cmds-target.c
> @@ -189,7 +189,6 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
>       i = 0;
>       while (i < l) {
>           switch(wsize) {
> -            default:
>           case 1:
>               v = ldub_p(buf + i);
>               break;
> @@ -202,6 +201,9 @@ static void memory_dump(Monitor *mon, int count, int format, int wsize,
>           case 8:
>               v = ldq_p(buf + i);
>               break;
> +            default:
> +                v = ldub_p(buf + i);
> +                break;
>           }
>           monitor_printf(mon, " ");
>           switch(format) {
> -- 
> 2.47.0
diff mbox series

Patch

diff --git a/monitor/hmp-cmds-target.c b/monitor/hmp-cmds-target.c
index ff01cf9d8d..eea8ca047b 100644
--- a/monitor/hmp-cmds-target.c
+++ b/monitor/hmp-cmds-target.c
@@ -189,7 +189,6 @@  static void memory_dump(Monitor *mon, int count, int format, int wsize,
         i = 0;
         while (i < l) {
             switch(wsize) {
-            default:
             case 1:
                 v = ldub_p(buf + i);
                 break;
@@ -202,6 +201,9 @@  static void memory_dump(Monitor *mon, int count, int format, int wsize,
             case 8:
                 v = ldq_p(buf + i);
                 break;
+            default:
+                v = ldub_p(buf + i);
+                break;
             }
             monitor_printf(mon, " ");
             switch(format) {