digitalmars.D.bugs - 0.93 bug with dyn array returns?
- Miles (16/16) Jun 26 2004 First post to digitalmars news... I'm really interested in D, but with a...
- Derek (8/26) Jun 26 2004 You are correct that it is returning a pointer to a stack entity. The
- Serge Semashko (13/39) Jun 27 2004 Right, it is expected to behave so, but it is very nonobvious and almost...
First post to digitalmars news... I'm really interested in D, but with a
few minutes of programming, I found something that may be a bug. If I do:
char[] test() {
char[5] res = "12345";
return res;
}
char[] result = test();
result receives right number of elements, but with garbage in their
place. If I printf result, even more garbage is generated in it. If I
change res in test() to char[], it returns what is expected to.
Looks like `return res;´ is returning a char[] structure with the right
length field, but with a data pointer pointing to the stack within
test(), which is invalidated after the function returns.
Sorry if this is a known issue.
--
Miles
Jun 26 2004
On Sat, 26 Jun 2004 19:15:58 -0300, Miles wrote:
First post to digitalmars news... I'm really interested in D, but with a
few minutes of programming, I found something that may be a bug. If I do:
char[] test() {
char[5] res = "12345";
return res;
}
char[] result = test();
result receives right number of elements, but with garbage in their
place. If I printf result, even more garbage is generated in it. If I
change res in test() to char[], it returns what is expected to.
Looks like `return res;´ is returning a char[] structure with the right
length field, but with a data pointer pointing to the stack within
test(), which is invalidated after the function returns.
Sorry if this is a known issue.
You are correct that it is returning a pointer to a stack entity. The
'solution' is to return a copy of that array...
return res.dup;
BTW, this is how D is expected to behave.
--
Derek
Melbourne, Australia
Jun 26 2004
Derek wrote:Right, it is expected to behave so, but it is very nonobvious and almost every newbee hits this problem. Can D compiler detect this situation as compile time error (array allocated on stack as a return value) or add some runtime checks that can help debugging this? Another nonobvious thing that a newbee can hit is the use of local string as associative array index, just try the following: char[] i; int[char[]] dict; i = "abc"; dict[i] = 1; i = "def"; dict[i] = 2;First post to digitalmars news... I'm really interested in D, but with a few minutes of programming, I found something that may be a bug. If I do: char[] test() { char[5] res = "12345"; return res; } char[] result = test(); result receives right number of elements, but with garbage in their place. If I printf result, even more garbage is generated in it. If I change res in test() to char[], it returns what is expected to. Looks like `return res;´ is returning a char[] structure with the right length field, but with a data pointer pointing to the stack within test(), which is invalidated after the function returns. Sorry if this is a known issue.You are correct that it is returning a pointer to a stack entity. The 'solution' is to return a copy of that array... return res.dup; BTW, this is how D is expected to behave.
Jun 27 2004








Serge Semashko <serge lxnt.info>