[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