[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-Id: <1248387908.3498.35.camel@Joe-Laptop.home>
Date: Thu, 23 Jul 2009 15:25:08 -0700
From: Joe Perches <joe@...ches.com>
To: Andrew Morton <akpm@...ux-foundation.org>
Cc: linux-kernel@...r.kernel.org
Subject: Re: [PATCH] kernel.h: Verify that arguments to swap() are the same
type
On Thu, 2009-07-23 at 14:47 -0700, Andrew Morton wrote:
> On Wed, 15 Jul 2009 18:34:21 -0700
> Joe Perches <joe@...ches.com> wrote:
>
> > Signed-off-by: Joe Perches <joe@...ches.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@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists