something weird with strerror_r
Mike Parker via Digitalmars-d
digitalmars-d at puremagic.com
Thu Jan 29 07:25:13 PST 2015
On 1/29/2015 11:40 PM, CodeSun wrote:
> Recently, I found something really weird when I use strerror_t function
> which is declared inside std.c.string.
> The code snippet is listed below:
> import std.c.string;
> import core.stdc.errno;
>
> void main() {
> import std.stdio;
> char[128] buf;
> strerror_r(errno, buf.ptr, buf.sizeof);
> writeln(cast(string)buf);
> }
>
> The terminal should print "Success" with errno=0, but in this example,
> the result is
> "��������������������������������������������������������������������������������������������������������������������������������".
>
> I test this snippet both on Archlinux and Ubuntu 14.04.1, and the result
> is same. If there is someone can help me?
> I wanna know if it is my mistake or it is just a bug.
> Thx!
The GNU version of strerror_r is documented as returning
"a pointer to a string containing the error message. This may be either
a pointer to a string that the function stores in buf, or a pointer to
some (immutable) static string (in which case buf is unused)."
So I think what you may have been seeing in this case is that it was
returning a static string, your buffer remained empty and the writeln
was printing a bunch of 0xFFs. Probably this is a better way to handle it:
void main()
{
import core.stdc.errno : errno;
import std.c.string : strerror_r;
// Static arrays are initialized to T.init. For
// char, T.init is 0xFF, *not* 0. The initializer
// here will fill the array with 0.
char[ 128 ] buf = 0;
auto cstr = strerror_r( errno, buf.ptr, buf.sizeof );
// Slice the C string with fromStringz. Unlike to!string, this
// does not allocate or copy.
import std.string : fromStringz;
writeln( cstr.fromStringz() );
}
More information about the Digitalmars-d
mailing list