From: Andrei Barbu <[email protected]> Subject: Re: [Chicken-users] bind egg and strings Date: Mon, 11 Feb 2013 02:04:16 -0500
> Attached is a trivial patch that does the strdup. > > > Andrei > > > On Sat, Feb 9, 2013 at 6:07 PM, Andrei Barbu <[email protected]> wrote: >> Hi, >> >> >> I've been using the bind egg and encountered some strange behaviour. >> I have: >> >> struct a { >> char *b; >> }; >> >> Bind generates: >> >> (begin >> (define a-b >> (foreign-lambda* c-string (((c-pointer (struct "a")) s)) >> "return(s->b);")) >> (define make-a >> (foreign-lambda* >> (c-pointer (struct "a")) >> ((c-string b)) >> "struct a *tmp_ = (struct a *)C_malloc(sizeof(struct >> a));\ntmp_->b = b;\n\nC_return(tmp_);"))) >> >> >> It seems to me that make-a is guaranteed to eventually lead to an out >> of bounds memory access because of: >> tmp_->b = b >> b is a c-string and will be GCed as soon a the foreign-lambda* returns. >> This is further exacerbated when using -mutable-fields making it >> impossible to set any char* member. >> Shouldn't the bind egg be doing an strdup here? Is there a way to get >> it do so? Or am I missing something? No, you're not missing anything. A strdup is perhaps not the perfect solution, since you can never now what the user intended, and whether this is a temporary data structure or a permanent one. The generated code should probably take a c-pointer argument and leave it the user to create a statically allocated string and convert it to a pointer. cheers, felix _______________________________________________ Chicken-users mailing list [email protected] https://lists.nongnu.org/mailman/listinfo/chicken-users
