D - [Bug] char[dim] -> char[] implicit conversion bug
- Marko Nikolic (21/21) Feb 20 2004 Here is another one. It seems that it has something to do with
-
Ben Hinkle
(37/37)
Feb 20 2004
"Marko Nikolic"
wrote in message - Marko Nikolic (8/33) Feb 20 2004 That's right. I am trying D after many years of not using C (and C++...
- Matthew (4/25) Feb 22 2004 You've taken a slice of something that no longer exists by the time the
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> 