all OS functions should be "nothrow @trusted @nogc"

Andrei Alexandrescu via Digitalmars-d digitalmars-d at puremagic.com
Thu Jul 27 05:37:26 PDT 2017


On 07/27/2017 07:27 AM, Timon Gehr wrote:
> On 27.07.2017 02:11, Steven Schveighoffer wrote:
>> On 7/26/17 7:56 PM, Andrei Alexandrescu wrote:
>>> On 07/26/2017 06:16 PM, Steven Schveighoffer wrote:
>>>> So I guess I should restate that we can assume no implementations 
>>>> exist that intentionally cause UB when stream is NULL (as in Timon's 
>>>> example). Either they check for null, and handle gracefully, or 
>>>> don't check and segfault.
>>>
>>> No need to worry about that at all. If worse comes to worst - i.e. we 
>>> do port to such an implementation - we can always provide a thin 
>>> wrapper that checks for NULL then calls the native function. No need 
>>> to change the signatures. -- Andrei
>>
>> Hm.. so you mean:
>>
>> pragma(mangle, "fgetc")
>> private extern(C) int real_fgetc(FILE * stream)
>>
>> extern(D) int fgetc(FILE *stream) @trusted
>> {
>>    if(stream == null) assert(0);
>>    return real_fgetc(stream);
>> }
>>
>> Yeah, that should work well actually. Nice!
>>
>> -Steve
> 
> That works but it changes the signature. (extern(D) vs. extern(C)).

There are a number of techniques allowing you to daisy chain C functions 
in libraries without changing names by using e.g. linking order or 
dynamic symbol loading. Sounds exactly like the kind of problem to 
tackle when you see it. We have much more pressing things to be on. -- 
Andrei


More information about the Digitalmars-d mailing list