D - [Bug] char[dim] -> char[] implicit conversion bug
- Marko Nikolic <markoni69 verat.net> Feb 20 2004
- "Ben Hinkle" <bhinkle4 juno.com> Feb 20 2004
- Marko Nikolic <markoni69 verat.net> Feb 20 2004
- "Matthew" <matthew.hat stlsoft.dot.org> Feb 22 2004
Here is another one. It seems that it has something to do with
implicit conversion from char[dim] to char[]:
markoni titan ~/src/dbug
$ cat char.d
import std.c.stdio;
void main() {
char[64] buf;
// char[] buf = new char[64]; // it works if replaced with this
sprintf(buf, "Hello, World!\n");
printf("buf: %.*s\n", buf); // Works OK
throw new Error(buf); // prints garbage
}
markoni titan ~/src/dbug
$ dmd char.d
d:\dmd\bin\..\..\dm\bin\link.exe char,,,user32+kernel32/noi;
markoni titan ~/src/dbug
$ ./char.exe
buf: Hello, World!
Error: Ç ↕
Regards,
Marko
Feb 20 2004
"Marko Nikolic" <markoni69 verat.net> wrote in message
news:c15ncd$d91$1 digitaldaemon.com...
| Here is another one. It seems that it has something to do with
| implicit conversion from char[dim] to char[]:
|
| markoni titan ~/src/dbug
| $ cat char.d
| import std.c.stdio;
|
| void main() {
| char[64] buf;
| // char[] buf = new char[64]; // it works if replaced with this
|
| sprintf(buf, "Hello, World!\n");
| printf("buf: %.*s\n", buf); // Works OK
| throw new Error(buf); // prints garbage
| }
The pointer to a local variable on the stack becomes invalid once the scope is
exited.
Something like
throw new Error(buf.dup);
will copy the local string from the stack to the heap. Since "new" allocates
from
the heap that will work, too.
|
| markoni titan ~/src/dbug
| $ dmd char.d
| d:\dmd\bin\..\..\dm\bin\link.exe char,,,user32+kernel32/noi;
|
| markoni titan ~/src/dbug
| $ ./char.exe
| buf: Hello, World!
|
| Error: Ç ?
|
| Regards,
| Marko
Feb 20 2004
Ben Hinkle wrote:"Marko Nikolic" <markoni69 verat.net> wrote in message news:c15ncd$d91$1 digitaldaemon.com... | Here is another one. It seems that it has something to do with | implicit conversion from char[dim] to char[]: | | markoni titan ~/src/dbug | $ cat char.d | import std.c.stdio; | | void main() { | char[64] buf; | // char[] buf = new char[64]; // it works if replaced with this | | sprintf(buf, "Hello, World!\n"); | printf("buf: %.*s\n", buf); // Works OK | throw new Error(buf); // prints garbage | } The pointer to a local variable on the stack becomes invalid once the scope is exited. Something like throw new Error(buf.dup); will copy the local string from the stack to the heap. Since "new" allocates from the heap that will work, too.
That's right. I am trying D after many years of not using C (and C++ even more - I never liked C++) - I used mainly Java and scripting languages) so I got very comfortable in not having memory management in mind ;> Thanks for your help. Regards, Marko
Feb 20 2004
You've taken a slice of something that no longer exists by the time the slice is used. "Marko Nikolic" <markoni69 verat.net> wrote in message news:c15ncd$d91$1 digitaldaemon.com...Here is another one. It seems that it has something to do with implicit conversion from char[dim] to char[]: markoni titan ~/src/dbug $ cat char.d import std.c.stdio; void main() { char[64] buf; // char[] buf = new char[64]; // it works if replaced with this sprintf(buf, "Hello, World!\n"); printf("buf: %.*s\n", buf); // Works OK throw new Error(buf); // prints garbage } markoni titan ~/src/dbug $ dmd char.d d:\dmd\bin\..\..\dm\bin\link.exe char,,,user32+kernel32/noi; markoni titan ~/src/dbug $ ./char.exe buf: Hello, World! Error: Ç ? Regards, Marko
Feb 22 2004









Marko Nikolic <markoni69 verat.net> 