writeln() assertion failed in hybrid x64

Jorge A. S. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Sep 4 08:10:21 PDT 2014


I'm having an error related to yours: when I call writeln 
function in a closed stdout I will get a segfault message. 
Example:

import std.stdio;

void main() {
   stdout.close();
   write("hello\n");
}

The code above will crash with segfault buf the following code 
will raise an exception instead:

import std.stdio;

void main() {
   stdout.close();
   stdout.write("hello\n");
}

In one of the specializations of the write function in the 
std.stdio (the call site that you showed in your post) no check 
for closed stdout (when stdout._p is null) is done. I can't say 
if this is a bug in the write function or the desired behaviour 
(I'm a novice here).

On Wednesday, 3 September 2014 at 18:48:00 UTC, Szymon Gatner 
wrote:
> On Wednesday, 3 September 2014 at 09:55:55 UTC, Szymon Gatner 
> wrote:
>> Hey,
>>
>> I am trying to build hybrid (C++, D) application (more here: 
>> http://forum.dlang.org/thread/ugkpqprobonorbdunxsx@forum.dlang.org) 
>> but I am now getting assertion failure from within writeln(). 
>> writeln() is called from a D function that has C++ linkage:
>>
>> D definition:
>>
>> extern (C++) void printSomething()
>> {
>>  writeln("hello from D");
>> }
>>
>>
>> usage from C++:
>>
>> extern "C++" void printSomething();
>>
>> int main()
>> {
>>  DRuntime druntime; // rt_init(), rt_term()
>>  printSomething();
>> }
>>
>> this causes run-time assertion in fprintf() called from within 
>> writeln():
>>
>> int __cdecl fprintf (
>>        FILE *str,
>>        const char *format,
>>        ...
>>        )
>> /*
>> * 'F'ile (stream) 'PRINT', 'F'ormatted
>> */
>> {
>>    va_list(arglist);
>>    FILE *stream;
>>    int buffing;
>>    int retval=0;
>>
>>    _VALIDATE_RETURN( (str != NULL), EINVAL, -1); <=== assetion 
>> here
>>
>> [...]
>> }
>>
>> meaning that str arg passed is null. writelns()'s call site:
>>
>>        enforce(fprintf(.stdout._p.handle, "%.*s\n",
>>                        cast(int) args[0].length, args[0].ptr)
>> >= 0);
>>
>> so for some reason .stdout._p.handle is null.
>
> Any ideas why this happens?



More information about the Digitalmars-d-learn mailing list