www.digitalmars.com         C & C++   DMDScript  

D - [Bug] char[dim] -> char[] implicit conversion bug

reply Marko Nikolic <markoni69 verat.net> writes:
    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
next sibling parent reply "Ben Hinkle" <bhinkle4 juno.com> writes:
"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
parent Marko Nikolic <markoni69 verat.net> writes:
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
prev sibling parent "Matthew" <matthew.hat stlsoft.dot.org> writes:
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