lkml.org 
[lkml]   [2009]   [Jul]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
SubjectRe: [PATCH] kernel.h: Verify that arguments to swap() are the same type
From
Date
On Thu, 2009-07-23 at 14:47 -0700, Andrew Morton wrote:
> On Wed, 15 Jul 2009 18:34:21 -0700
> Joe Perches <joe@perches.com> wrote:
>
> > Signed-off-by: Joe Perches <joe@perches.com>
> >
> > diff --git a/include/linux/kernel.h b/include/linux/kernel.h
> > index d6320a3..72878a5 100644
> > --- a/include/linux/kernel.h
> > +++ b/include/linux/kernel.h
> > @@ -637,8 +637,13 @@ static inline void ftrace_dump(void) { }
> > /*
> > * swap - swap value of @a and @b
> > */
> > -#define swap(a, b) \
> > - do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
> > +#define swap(a, b) \
> > +do { \
> > + typeof(a) __tmp = (a); \
> > + BUILD_BUG_ON(!__same_type(__tmp, (b))); \
> > + (a) = (b); \
> > + (b) = __tmp; \
> > +} while (0)
> >
>
> I wonder if we can do
>
> typecheck(a, typeof(b));d

Yes. It generates a warning rather than a build bug.
Maybe that's better.

$ cat -n typeck.c
1 #define typecheck(type, x) \
2 ({ type __dummy; \
3 typeof(x) __dummy2; \
4 (void)(&__dummy == &__dummy2); \
5 1; \
6 })
7
8 #define swap(a, b) \
9 do { typeof(a) __tmp; \
10 typecheck(typeof(a), (b)); \
11 __tmp = (a); \
12 (a) = (b); \
13 (b) = __tmp; \
14 } while (0)
15
16 int main(int argc, char** argv)
17 {
18 int a,b;
19 long j,k;
20
21 swap(a,b);
22 swap(j,k);
23 swap(a,j);
24 }
$ gcc typeck.c
typeck.c: In function ‘main’:
typeck.c:23: warning: comparison of distinct pointer types lacks a cast


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2009-07-24 00:27    [W:0.084 / U:0.232 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site