Messages in this thread | | | Subject | Re: [PATCH] kernel.h: Verify that arguments to swap() are the same type | From | Joe Perches <> | Date | Thu, 23 Jul 2009 15:25:08 -0700 |
| |
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/
| |