[parted-devel] Problem with Linux "3.0"
Richard W.M. Jones
rjones at redhat.com
Tue Jun 7 16:33:09 UTC 2011
On Tue, Jun 07, 2011 at 06:27:27PM +0200, Jim Meyering wrote:
> H. Peter Anvin wrote:
> > On 06/07/2011 08:53 AM, Jim Meyering wrote:
> >> Yes, just like the original code.
> >> The reason I prefer not to ignore the return value is to avoid
> >> warnings from static analyzers.
> >
> > Declare it (void) explicitly then...
>
> With some versions of gcc, the (void) cast does not suffice
> to avoid the warn-unused-result warnings.
> That's why the gnulib "ignore-value" module came to be.
> So we can do this:
>
> ignore_value (sscanf (...));
>
> But that (like the void cast) is pretty ugly.
> But using two sscanf calls with the associated logic is even uglier,
> so I'll go for your change after all.
>
> However, I don't want to ignore the return value.
>
> How about the patch below?
> I left your name on it.
> Let me know if that's ok.
>
> >From 0b6cd440ac094cefd791dba9d19d112aafd09fdf Mon Sep 17 00:00:00 2001
> From: "H. Peter Anvin" <hpa at zytor.com>
> Date: Tue, 7 Jun 2011 18:03:14 +0200
> Subject: [PATCH] libparted: simplify kernel version-parsing logic
>
> * libparted/arch/linux.c: (_get_linux_version): Simplify and add
> an assertion.
> ---
> libparted/arch/linux.c | 15 +++++----------
> 1 files changed, 5 insertions(+), 10 deletions(-)
>
> diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
> index 111816c..bfe2982 100644
> --- a/libparted/arch/linux.c
> +++ b/libparted/arch/linux.c
> @@ -601,22 +601,17 @@ _get_linux_version ()
> static int kver = -1;
>
> struct utsname uts;
> - int major;
> - int minor;
> - int teeny;
> + int major = 0;
> + int minor = 0;
> + int teeny = 0;
>
> if (kver != -1)
> return kver;
>
> if (uname (&uts))
> return kver = 0;
> - if (sscanf (uts.release, "%u.%u.%u", &major, &minor, &teeny) == 3)
> - ; /* ok */
> - else if (sscanf (uts.release, "%u.%u", &major, &minor) == 2)
> - teeny = 0;
> - else
> - return kver = 0;
> -
> + int n = sscanf (uts.release, "%u.%u.%u", &major, &minor, &teeny);
> + assert (n == 2 || n == 3);
> return kver = KERNEL_VERSION (major, minor, teeny);
> }
>
> --
> 1.7.6.rc0.293.g40857
The patch looks good (I didn't test it). It's definitely an
improvement that the code doesn't return 0 when it doesn't know how to
parse the release string.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming blog: http://rwmj.wordpress.com
Fedora now supports 80 OCaml packages (the OPEN alternative to F#)
http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora
More information about the parted-devel
mailing list