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