GC seems to crash my C-code function

Steven Schveighoffer schveiguy at gmail.com
Thu Sep 16 18:02:44 UTC 2021


On 9/16/21 1:08 PM, frame wrote:
> On Thursday, 16 September 2021 at 15:34:25 UTC, Steven Schveighoffer wrote:
> 
>> `dup` is a GC allocation. Are you using that in your C code? the GC 
>> might be collecting that string.
> 
> The compiler doesn't show that lines with -vgc. Maybe it knows that it 
> is only stack allocated?
> 
> Technically, the GC could collect that data if it wants - it's not 
> longer used after the function returns. At least I control that the GC 
> cannot collect it till my data is processed, so there should be no problem.

Are you sure? Be very pedantic about what C functions do with the data 
you send it. Sometimes they store it somewhere to use later. Sometimes 
they expect it to be allocated by the C heap, etc.

Without seeing how you use it, I can't tell you if it's wrong or not.

> 
> I guess the C-methods did corrupt the memory which the compiler has 
> reserved for that function data statically and then the GC collect marks 
> it as free or some other UB.
> 
>>
>> You are better off to cast away the immutable (as long as you are 100% 
>> sure the C code isn't writing to it), as the string literal will not 
>> be collected.
>>
> 
> Yes, I changed it to stringz and a cast and the problem is gone so far. 
> All char* are read only in the function or passed to stdlib functions 
> that should not modify it.
> 
> 

If it's a literal, you don't need to toStringz (which also allocates). 
All string literals are zero-terminated (and actually implicitly 
castable to `immutable char *`).

-Steve


More information about the Digitalmars-d-learn mailing list