[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: linux/kernel.h (&_x == &_y); why
On Tue, Dec 02, 2003 at 15:12:52 -0800, John Tyner wrote:
> I believe that it is so that gcc will throw a warning if the two types
> are not compatible.
Actualy, it should throw a warning if they are not exactly the same,
because if they are not, the comparsion breaks aliasing rules.
Especially it should throw a warning if one is signed and the other is
not.
> John
>
> On Tue, Dec 02, 2003 at 03:32:57PM -0700, Pat LaVarre wrote:
> > Anybody here understand the '"unnecessary" pointer comparison' of the
> > min/max of linux/kernel.h?
> >
> > Are we trusting gcc to disregard that sourceline? If yes then why
> > bother? Why not omit that sourceline?
> >
> > Pat LaVarre
> >
> > ---
> >
> > http://lwn.net/Articles/driver-porting/
> >
> > Miscellaneous changes ...
> > http://lwn.net/Articles/22196/
> >
> > ...
> > The min() and max() macros
> >
> > A common step in the development of most C programmers, shortly after
> > they learn to include stdio.h seems to be the definition of macros like:
> >
> > #define max(a,b) ((a) > (b) ? (a) : (b))
> >
> > In 2.5, it was noted that a number of kernel developers had seemingly
> > not moved beyond that stage, and there was an unbelievable number of
> > min() and max() definitions sprinkled throughout the kernel source.
> > These definitions were not only redundant - they were unsafe. A max()
> > macro as defined above has the usual problem with side effects; it also
> > is not type-safe, especially when signed and unsigned values are used.
> >
> > Linus initially added his own definition of min() and max() which added
> > a third argument - an explicit type. That change upset people badly
> > enough that some put substantial amounts of time into developing
> > two-argument versions that are type and side-effect safe. The result now
> > lives in <linux/kernel.h>, and should be used in preference to any
> > locally-defined version.
> > ...
> >
> > http://lxr.linux.no/source/include/linux/kernel.h?v=2.6.0-test7#L157
> >
> > ...
> > 157 /*
> > 158 * min()/max() macros that also do
> > 159 * strict type-checking.. See the
> > 160 * "unnecessary" pointer comparison.
> > 161 */
> > 162 #define min(x,y) ({ \
> > 163 const typeof(x) _x = (x); \
> > 164 const typeof(y) _y = (y); \
> > 165 (void) (&_x == &_y); \
> > 166 _x < _y ? _x : _y; })
> > 167
> > 168 #define max(x,y) ({ \
> > 169 const typeof(x) _x = (x); \
> > 170 const typeof(y) _y = (y); \
> > 171 (void) (&_x == &_y); \
> > 172 _x > _y ? _x : _y; })
> > ...
> >
> >
> > --
> > Kernelnewbies: Help each other learn about the Linux kernel.
> > Archive: http://mail.nl.linux.org/kernelnewbies/
> > FAQ: http://kernelnewbies.org/faq/
> >
> --
> Kernelnewbies: Help each other learn about the Linux kernel.
> Archive: http://mail.nl.linux.org/kernelnewbies/
> FAQ: http://kernelnewbies.org/faq/
>
-------------------------------------------------------------------------------
Jan 'Bulb' Hudec <bulb@ucw.cz>
--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive: http://mail.nl.linux.org/kernelnewbies/
FAQ: http://kernelnewbies.org/faq/