Cannot call @system funciton (stdout)
Steven Schveighoffer
schveiguy at gmail.com
Sun Aug 16 13:31:00 UTC 2020
On 8/16/20 6:07 AM, Simen Kjærås wrote:
> On Saturday, 15 August 2020 at 23:59:36 UTC, Joel wrote:
>> ../../JMiscLib/source/jmisc/base.d(176,2): Error: @safe function
>> jmisc.base.upDateStatus!string.upDateStatus cannot call @system
>> function std.stdio.makeGlobal!"core.stdc.stdio.stdout".makeGlobal
>> /Library/D/dmd/src/phobos/std/stdio.d(4837,20):
>> std.stdio.makeGlobal!"core.stdc.stdio.stdout".makeGlobal is declared here
>>
>> I got around it by avoiding 'stdout'.
>
> First, what's wrong with using writeln and friends instead of directly
> mucking about with stdout? :p
>
> stdout is __gshared, so it's available on any thread at any time. That's
> not @safe, so it's @system.
>
> If you know you're not using stdout from multiple threads, or don't care
> (it might be perfectly safe even though it's possible to misuse), you
> can use this code:
>
> @property File trustedStdout() @trusted
> {
> return stdout;
> }
>
> That's a @trusted wrapper that you can call from @safe code. It's not
> actually safe though, as multiple threads could be using trustedStdout
> at the same time. In many use cases, this is unlikely to matter, but
> it's wroth keeping in mind.
Technically, there's nothing unsafe about reading stdout, as long as you
are not setting it. Otherwise, writeln wouldn't be @safe (as all it does
is call a private trustedStdout).
The whole thing is messy IMO, and should be revisited.
-Steve
More information about the Digitalmars-d-learn
mailing list