2011-03-25 10:19:28

by Xuetao Guan

[permalink] [raw]
Subject: Warning with asm-generic/div64.h

Hi, Arnd:

Following warning is generated when using <asm-generic/div64.h>

kernel/power/hibernate.c: In function 'swsusp_show_speed':
kernel/power/hibernate.c:227: warning: comparison of distinct pointer types lacks a cast

After expanding the do_div() macro, the problem line is:

(void)(((typeof((n)) *)0) == ((uint64_t *)0));

while the type of n is s64.

I am puzzled with the usage of the problem line.

And how to correct it?

Guan Xuetao


2011-03-25 13:40:03

by Arnd Bergmann

[permalink] [raw]
Subject: Re: Warning with asm-generic/div64.h

On Friday 25 March 2011, Guan Xuetao wrote:
> Following warning is generated when using <asm-generic/div64.h>
>
> kernel/power/hibernate.c: In function 'swsusp_show_speed':
> kernel/power/hibernate.c:227: warning: comparison of distinct pointer types lacks a cast
>
> After expanding the do_div() macro, the problem line is:
>
> (void)(((typeof((n)) *)0) == ((uint64_t *)0));
>
> while the type of n is s64.
>
> I am puzzled with the usage of the problem line.
>
> And how to correct it?

The purpose of this line is to generate a warning when the input is the
wrong type, as the comment says:
/* The unnecessary pointer compare is there
* to check for type safety (n must be 64bit)

The macro doesn't work for signed input or for 32 bit input. I'd suggest
fixing the caller to use an unsigned type.

Arnd

2011-03-29 11:43:12

by Xuetao Guan

[permalink] [raw]
Subject: RE: Warning with asm-generic/div64.h



> -----Original Message-----
> From: Arnd Bergmann [mailto:[email protected]]
> Sent: Friday, March 25, 2011 9:40 PM
> To: Guan Xuetao
> Cc: [email protected]; [email protected]
> Subject: Re: Warning with asm-generic/div64.h
>
> On Friday 25 March 2011, Guan Xuetao wrote:
> > Following warning is generated when using <asm-generic/div64.h>
> >
> > kernel/power/hibernate.c: In function 'swsusp_show_speed':
> > kernel/power/hibernate.c:227: warning: comparison of distinct pointer types lacks a cast
> >
> > After expanding the do_div() macro, the problem line is:
> >
> > (void)(((typeof((n)) *)0) == ((uint64_t *)0));
> >
> > while the type of n is s64.
> >
> > I am puzzled with the usage of the problem line.
> >
> > And how to correct it?
>
> The purpose of this line is to generate a warning when the input is the
> wrong type, as the comment says:
> /* The unnecessary pointer compare is there
> * to check for type safety (n must be 64bit)
Yes, it works. And, I think type s64 should be ok also.

>
> The macro doesn't work for signed input or for 32 bit input. I'd suggest
> fixing the caller to use an unsigned type.

Then,
Cc: Len Brown <[email protected]> (supporter:SUSPEND TO RAM)
Cc: Pavel Machek <[email protected]> (supporter:SUSPEND TO RAM)
Cc: "Rafael J. Wysocki" <[email protected]> (supporter:SUSPEND TO RAM)
Cc: [email protected] (open list:SUSPEND TO RAM)

>
> Arnd
Thanks, and sorry for replying late.

Guan Xuetao

2011-03-29 11:59:12

by Arnd Bergmann

[permalink] [raw]
Subject: Re: Warning with asm-generic/div64.h

On Tuesday 29 March 2011, Guan Xuetao wrote:
> > The macro doesn't work for signed input or for 32 bit input. I'd suggest
> > fixing the caller to use an unsigned type.
>
> Then,
> Cc: Len Brown <[email protected]> (supporter:SUSPEND TO RAM)
> Cc: Pavel Machek <[email protected]> (supporter:SUSPEND TO RAM)
> Cc: "Rafael J. Wysocki" <[email protected]> (supporter:SUSPEND TO RAM)
> Cc: [email protected] (open list:SUSPEND TO RAM)

Yes, that sounds right.

Arnd