On Sun, Oct 24, 2010 at 09:50:42AM -0600, Vitaliy Margolen wrote: > On 10/24/2010 12:32 AM, Marcus Meissner wrote: > >Actually I would like to know if its just more than the dlls/shell32/pidl.c > >problem... > If you take a look at winternl.h you'll see number of structures > there look like: > typedef struct _foo { > ULONG length; > WCHAR buffer[1]; > } foo, *pfoo; > > Or just grep for '\[1\]' in include directory. Lots and lots of > declarations in all different places.
As I already wrote, this works. Here is a sample code which shows the problem dlls/shell32/pidl.c has: $ cat xx1.c #include <string.h> #include <stdlib.h> struct foo { int x; char y[1]; }; union bar { struct foo fo; long y; float fl; }; struct berk { int t; union bar b; }; int main(int argc, char **argv) { struct berk *x1; struct foo *x2; x1 = malloc (sizeof(struct berk) + 5); x2 = malloc (sizeof(struct foo) + 5); strcpy(x1->b.fo.y, "hallo"); strcpy(x2->y, "hallo"); } $ gcc -O2 -Wall -D_FORTIFY_SOURCE=2 -g xx1.c -o xx1 xx1.c: In function ‘main’: xx1.c:28:1: warning: control reaches end of non-void function In file included from /usr/include/string.h:640:0, from xx1.c:1: In function ‘strcpy’, inlined from ‘main’ at xx1.c:26:8: /usr/include/bits/string3.h:107:3: warning: call to __builtin___strcpy_chk will always overflow destination buffer Only the "strcpy(x1->b.fo.y, "hallo");" with the nested struct is warned about, while the second strcpy works fine. It is just nested structs it does not like at this time. Ciao, Marcus