chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Chicken-users] bind egg and strings


From: Felix
Subject: Re: [Chicken-users] bind egg and strings
Date: Fri, 15 Feb 2013 11:53:00 +0100 (CET)

From: Andrei Barbu <address@hidden>
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 <address@hidden> 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]