On 02/16/2015 05:44 AM, Rusty Russell wrote: > Andrey Ryabinin <a.ryabinin@xxxxxxxxxxx> writes: >> MODULE_DEVICE_TABLE() macro used to create aliases to device tables. >> Normally alias should have the same type as aliased symbol. >> >> Device tables are arrays, so they have 'struct type##_device_id[x]' >> types. Alias created by MODULE_DEVICE_TABLE() will have non-array type - >> 'struct type##_device_id'. >> >> This inconsistency confuses compiler, it could make a wrong >> assumption about variable's size which leads KASan to >> produce a false positive report about out of bounds access. > > Hmm, as Andrew Morton points out, this breaks some usage; if we just > fix the type (struct type##_device_id[]) will that work instead? > > I'm guessing not, since typeof(x) will presumably preserve sizing > information? > Yes, this won't work. In this particular case 'struct type##_device_id[]' would be equivalent to 'struct type##_device_id[1]' $ cat test.c struct d { int a; int b; }; struct d arr[] = { {1, 2}, {3, 4}, {} }; extern struct d arr_alias[] __attribute__((alias("arr"))); $ gcc -c test.c test.c:8:17: warning: array ‘arr_alias’ assumed to have one element extern struct d arr_alias[] __attribute__((alias("arr"))); -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>