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

Reply via email to