2014-04-22 05:46:26

by Ley Foon Tan

[permalink] [raw]
Subject: min() and max() have warning: comparison of distinct pointer types lacks a cast

Hi all

Have these warning messages when compiling kernel.
Anyone know what's wrong?

Regards.
----------------------------
In file included from mm/readahead.c:10:0:
mm/readahead.c: In function 'max_sane_readahead':
include/linux/kernel.h:713:17: warning: comparison of distinct pointer
types lacks a cast [enabled by default]
(void) (&_min1 == &_min2); \
^
mm/readahead.c:242:9: note: in expansion of macro 'min'
return min(nr, MAX_READAHEAD);
^

-------------------------------------------------------------------------------
mm/rmap.c:1279:22: note: in expansion of macro 'min'
#define CLUSTER_SIZE min(32*PAGE_SIZE, PMD_SIZE)
^
mm/rmap.c:1280:25: note: in expansion of macro 'CLUSTER_SIZE'
#define CLUSTER_MASK (~(CLUSTER_SIZE - 1))
^
mm/rmap.c:1298:39: note: in expansion of macro 'CLUSTER_MASK'
address = (vma->vm_start + cursor) & CLUSTER_MASK;
^


2014-04-22 23:46:54

by David Rientjes

[permalink] [raw]
Subject: Re: min() and max() have warning: comparison of distinct pointer types lacks a cast

On Tue, 22 Apr 2014, LF.Tan wrote:

> Hi all
>
> Have these warning messages when compiling kernel.
> Anyone know what's wrong?
>
> Regards.
> ----------------------------
> In file included from mm/readahead.c:10:0:
> mm/readahead.c: In function 'max_sane_readahead':
> include/linux/kernel.h:713:17: warning: comparison of distinct pointer
> types lacks a cast [enabled by default]
> (void) (&_min1 == &_min2); \
> ^
> mm/readahead.c:242:9: note: in expansion of macro 'min'
> return min(nr, MAX_READAHEAD);
> ^
>

In min(nr, MAX_READAHEAD), nr is of type unsigned long and MAX_READAHEAD
is of type unsigned long or int depending on the arch. This warns because
of strict type-checking, otherwise the results could be unexpected when
comparing unsigned long to signed long, for example.

I don't think fixing this to do min_t() is the right solution since
PAGE_SIZE is assumbed to be defined to be ul. Please send your arch and
.config.