Re: [tip:x86/mm] x86, mm: Use a bitfield to mask nuisance get_user()warnings

From: H. Peter Anvin
Date: Tue Feb 12 2013 - 13:26:15 EST


I just thought up this variant, I'm about to test it, but H.J., do you
see any problems with it?

#define itype(x) \
__typeof__(__builtin_choose_expr(sizeof(*(x)) > sizeof(0UL), 0ULL, 0UL))

I tried it out with a small test program (attached), and it seems to
work. Next for using it in the kernel...

-hpa

#include <stdio.h>
#include <stdlib.h>

#define itype(x) __typeof__(__builtin_choose_expr(sizeof(*(x)) > sizeof(0UL), 0ULL, 0UL))

int main(void)
{
const char *a;
const short *b;
const int *c;
const long *d;
const long long *e;
const void **p;

itype(a) aa;
itype(b) bb;
itype(c) cc;
itype(d) dd;
itype(e) ee;
itype(p) pp;

aa = 1;
bb = 2;
cc = 3;
dd = 4;
ee = 5;
pp = 6;

printf("a = %zu\n", sizeof(aa));
printf("b = %zu\n", sizeof(bb));
printf("c = %zu\n", sizeof(cc));
printf("d = %zu\n", sizeof(dd));
printf("e = %zu\n", sizeof(ee));
printf("p = %zu\n", sizeof(pp));

return 0;
}