digitalmars.D.bugs - [Issue 1679] New: D should cast char[] to char* when used in a variadic argument in extern(C) context
- d-bugmail puremagic.com (54/54) Nov 19 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1679
- Brad Roberts (5/11) Nov 19 2007 It would only potentially be safe to implicitly do this for literals. I...
- d-bugmail puremagic.com (11/11) Nov 27 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1679
http://d.puremagic.com/issues/show_bug.cgi?id=1679 Summary: D should cast char[] to char* when used in a variadic argument in extern(C) context Product: D Version: unspecified Platform: PC URL: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=451707 OS/Version: Linux Status: NEW Severity: critical Priority: P5 Component: DMD AssignedTo: bugzilla digitalmars.com ReportedBy: arthur.loiret gmail.com The following code: -------------------------------------------------- import std.c.process; int main(char args[][]) { execl("/bin/sh", "sh", "-c", "ls", null); printf("%m\n"); return -1; } -------------------------------------------------- Doesn't work: Bad address zsh: exit 255 ./test exelc prototype is: extern(C) int exelc(char *, char *, ...) because if I do that: And the following code works: -------------------------------------------------- extern(C) int execl(char *path, char *arg, char*, char*, char*, ...); int main(char args[][]) { execl("/bin/sh", "sh", "-c", "ls", null); printf("%m\n"); return -1; } -------------------------------------------------- So does this one: -------------------------------------------------- import std.c.process; int main(char args[][]) { execl("/bin/sh", "sh", cast(char*)"-c", cast(char*)"ls", null); printf("%m\n"); return -1; } -------------------------------------------------- Pierre Habouzit understood the issue, here is his explanation: When the "-c" argument is sent as the first argument of the variadic part, D sends a char[] and not a char*, meaning that it puts 2, "-c" on the stack, which confuses the C. I believe that D should do the implicit cast in that case, as it'll break a _lot_ of programs using C APIs and variadic arguments in very subtle ways. --
Nov 19 2007
On Tue, 20 Nov 2007, d-bugmail puremagic.com wrote:When the "-c" argument is sent as the first argument of the variadic part, D sends a char[] and not a char*, meaning that it puts 2, "-c" on the stack, which confuses the C. I believe that D should do the implicit cast in that case, as it'll break a _lot_ of programs using C APIs and variadic arguments in very subtle ways.It would only potentially be safe to implicitly do this for literals. In D, char[]'s don't necessairily have a null terminating byte. Literals do. This implicit cast used to exist and was removed due to it being fairly unsafe to do in the general case.
Nov 19 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1679 bugzilla digitalmars.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |WONTFIX ------- Comment #2 from bugzilla digitalmars.com 2007-11-27 13:21 ------- I don't think there's any safe way of doing this. If this behavior is implemented, other things break. You can use the .ptr suffix to make it work. --
Nov 27 2007