Thread overview | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
December 10, 2009 [Issue 3604] New: extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
http://d.puremagic.com/issues/show_bug.cgi?id=3604 Summary: extern(C) callable function with array parameters broken Product: D Version: unspecified Platform: Other OS/Version: Linux Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: nobody@puremagic.com ReportedBy: baryluk@smp.if.uj.edu.pl --- Comment #0 from Witold Baryluk <baryluk@smp.if.uj.edu.pl> 2009-12-10 10:17:12 PST --- I found a regression in 2.037. It was working in 2.032. import core.sys.posix.unistd : pipe; void main() { int[2] input, output; writefln("input: %s", input); writefln("input.ptr: %s", input.ptr); writefln("cast input: %s", cast(char*)input); ttt(input); if (pipe(input) != 0) { throw new Exception("can't create input pipe"); } else { writeln("ok"); } } extern(C) int ttt(int[2] x) { writefln("x = %s", x); writefln("x[0] = %s", x[0]); writefln("x[1] = %s", x[1]); return 0; } this programs print: ==== input: 0 0 input.ptr: BF85E068 cast input: BF85E068 x = 0 0 x[0] = 0 x[1] = 0 object.Exception: can't create input pipe ==== but should: ==== input: 0 0 input.ptr: BF85E068 cast input: BF85E068 x = BF85E068 x[0] = 0 x[1] = 0 ok ==== -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
December 10, 2009 [Issue 3604] extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to Witold Baryluk | http://d.puremagic.com/issues/show_bug.cgi?id=3604 Witold Baryluk <baryluk@smp.if.uj.edu.pl> changed: What |Removed |Added ---------------------------------------------------------------------------- Platform|Other |x86 --- Comment #1 from Witold Baryluk <baryluk@smp.if.uj.edu.pl> 2009-12-10 10:31:47 PST --- In, 2.032 (just tested) it returns: $ ./bug3604 input: 0 0 input.ptr: BFA00CB8 cast input: BFA00CB8 x = 0 0 x[0] = 0 x[1] = 0 ok $ So not exactly what I written, but pipe is working. So i tested it more precisly: bug3604.d: extern(C) int tttc(int[2] x); void main() { int[2] input; tttc(input); } bug3604c.c: #include <stdio.h> int tttc(int x[2]) { printf("just in C\n"); printf("x=%p\n", x); printf("x[0]=%d\n", x[0]); printf("x[1]=%d\n", x[1]); printf("back from C\n"); } # gcc -c bug3604c.c # dmd2.032 bug3604.d bug3604c.o # ./bug3604 just in C x=0xbf988ff8 x[0]=0 x[1]=0 back from C # dmd2.037 bug3604.d bug3604c.o # ./bug3604 just in C x=(nil) Segmentation fault # So it is regression. In `strace` for "pipe" example I see for 2.032: pipe([3, 4]) = 0 and for 2.037: pipe(0) = -1 EFAULT (Bad address) So it also passes NULL pointer (jiust like in tttc function) . -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
December 10, 2009 [Issue 3604] extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to Witold Baryluk | http://d.puremagic.com/issues/show_bug.cgi?id=3604 Lutger <lutger.blijdestijn@gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |lutger.blijdestijn@gmail.co | |m --- Comment #2 from Lutger <lutger.blijdestijn@gmail.com> 2009-12-10 13:36:16 PST --- This is not a compiler bug, but due to the changed semantics (value instead of reference) of static arrays the extern(C) declaration of pipe is wrong. See also this post: http://www.digitalmars.com/webnews/newsgroups.php?art_group=digitalmars.D.learn&article_id=18393 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
December 11, 2009 [Issue 3604] extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to Witold Baryluk | http://d.puremagic.com/issues/show_bug.cgi?id=3604 --- Comment #3 from Witold Baryluk <baryluk@smp.if.uj.edu.pl> 2009-12-11 06:22:49 PST --- Changing declaration of pipe to extern(C) int pipe(int*); will make that D type system have less information than previous. currently, if I would write: extern(C) int pipe(int[2]); int[1] input; pipe(input); it will fail to compile because of wrong type. But with: extern(C) int pipe(int*); int[1] input; pipe(input.ptr); it will compile without any error. I see many other functions, in core which takes array of different sizes. How about just interpreting array parametern in extern(C) function as being passed via reference. I don't see what was wrong in previous approach. It gives some more verbosity to error messages. If anyway this is new intended behaviour, please document it and fix all headers in core.* and other extern(C) headers. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
December 11, 2009 [Issue 3604] extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to Witold Baryluk | http://d.puremagic.com/issues/show_bug.cgi?id=3604 Steven Schveighoffer <schveiguy@yahoo.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |schveiguy@yahoo.com --- Comment #4 from Steven Schveighoffer <schveiguy@yahoo.com> 2009-12-11 06:40:58 PST --- What about using ref int[2] instead? I just tested with your code modifying the signature and it works: [steves@steveslaptop testd]$ cat bug3604.d extern(C) int tttc(ref int[2] x); void main() { int[2] input; tttc(input); } [steves@steveslaptop testd]$ cat bug3604c.c #include <stdio.h> int tttc(int x[2]) { printf("just in C\n"); printf("x=%p\n", x); printf("x[0]=%d\n", x[0]); printf("x[1]=%d\n", x[1]); printf("back from C\n"); } [steves@steveslaptop testd]$ gcc -c bug3604c.c [steves@steveslaptop testd]$ ../dmd2.037/linux/bin/dmd bug3604.d bug3604c.o [steves@steveslaptop testd]$ ./bug3604 just in C x=0xbffa06e0 x[0]=0 x[1]=0 back from C I think this better captures the correct signature than what I suggested in the post. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
December 16, 2009 [Issue 3604] extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to Witold Baryluk | http://d.puremagic.com/issues/show_bug.cgi?id=3604 Witold Baryluk <baryluk@smp.if.uj.edu.pl> changed: What |Removed |Added ---------------------------------------------------------------------------- Component|DMD |druntime AssignedTo|nobody@puremagic.com |sean@invisibleduck.org --- Comment #5 from Witold Baryluk <baryluk@smp.if.uj.edu.pl> 2009-12-15 16:47:26 PST --- Ah, yes ref T[]; this sounds good. I will reassign this bug to druntime then, and hopfully trivial fixes will be on next release. PS. I just checked changlogs and there are nothing about this change in compiler or spec. :/ Maybe small update to http://digitalmars.com/d/2.0/interfaceToC.html ? -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
January 04, 2010 [Issue 3604] extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to Witold Baryluk | http://d.puremagic.com/issues/show_bug.cgi?id=3604 Walter Bright <bugzilla@digitalmars.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bugzilla@digitalmars.com --- Comment #6 from Walter Bright <bugzilla@digitalmars.com> 2010-01-04 14:47:18 PST --- Good idea, I've updated interfaceToC.html -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
January 21, 2010 [Issue 3604] extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to Witold Baryluk | http://d.puremagic.com/issues/show_bug.cgi?id=3604 --- Comment #7 from Witold Baryluk <baryluk@smp.if.uj.edu.pl> 2010-01-21 05:44:35 PST --- Thanks. Functions like sys.posix.unistd: pipe, encrypt sys.posix.stdlib: Xseed48, {e,j,n}rand48, lcong48 sys.posix.poll: poll sys.posix.sys.time: utimes sys.posix.sys.socket : socketpair are currently affected in druntime (from 2.039). -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
February 26, 2010 [Issue 3604] extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to Witold Baryluk | http://d.puremagic.com/issues/show_bug.cgi?id=3604 Lars T. Kyllingstad <bugzilla@kyllingen.net> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |bugzilla@kyllingen.net --- Comment #8 from Lars T. Kyllingstad <bugzilla@kyllingen.net> 2010-02-26 10:36:17 PST --- I ran into the problem with core.sys.posix.unistd.pipe() today. The following grep should have tracked down most of the problematic declarations: $ grep -r '(.*\w\+[[][0-9]' core/* core/sys/posix/sys/socket.d:int socketpair(int, int, int, int[2]); core/sys/posix/sys/socket.d: int socketpair(int, int, int, int[2]); core/sys/posix/sys/socket.d: int socketpair(int, int, int, int[2]); core/sys/posix/sys/socket.d: int socketpair(int, int, int, int[2]); core/sys/posix/sys/time.d:int utimes(in char*, in timeval[2]); // LEGACY core/sys/posix/sys/time.d: int utimes(in char*, in timeval[2]); // LEGACY core/sys/posix/sys/time.d: int utimes(in char*, in timeval[2]); core/sys/posix/sys/time.d: int utimes(in char*, in timeval[2]); core/sys/posix/stdlib.d:double erand48(ushort[3]); core/sys/posix/stdlib.d:c_long jrand48(ushort[3]); core/sys/posix/stdlib.d:void lcong48(ushort[7]); core/sys/posix/stdlib.d:c_long nrand48(ushort[3]); core/sys/posix/stdlib.d:ushort seed48(ushort[3]); core/sys/posix/stdlib.d: double erand48(ushort[3]); core/sys/posix/stdlib.d: c_long jrand48(ushort[3]); core/sys/posix/stdlib.d: void lcong48(ushort[7]); core/sys/posix/stdlib.d: c_long nrand48(ushort[3]); core/sys/posix/stdlib.d: ushort seed48(ushort[3]); core/sys/posix/stdlib.d: double erand48(ushort[3]); core/sys/posix/stdlib.d: c_long jrand48(ushort[3]); core/sys/posix/stdlib.d: void lcong48(ushort[7]); core/sys/posix/stdlib.d: c_long nrand48(ushort[3]); core/sys/posix/stdlib.d: ushort seed48(ushort[3]); core/sys/posix/stdlib.d: double erand48(ushort[3]); core/sys/posix/stdlib.d: c_long jrand48(ushort[3]); core/sys/posix/stdlib.d: void lcong48(ushort[7]); core/sys/posix/stdlib.d: c_long nrand48(ushort[3]); core/sys/posix/stdlib.d: ushort seed48(ushort[3]); core/sys/posix/unistd.d:int pipe(int[2]); core/sys/posix/unistd.d:void encrypt(char[64], int); core/sys/posix/unistd.d: void encrypt(char[64], int); core/sys/posix/unistd.d: void encrypt(char[64], int); (I've removed a few false positives in the above.) -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
May 17, 2010 [Issue 3604] extern(C) callable function with array parameters broken | ||||
---|---|---|---|---|
| ||||
Posted in reply to Witold Baryluk | http://d.puremagic.com/issues/show_bug.cgi?id=3604 Steven Schveighoffer <schveiguy@yahoo.com> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |rsinfu@gmail.com --- Comment #9 from Steven Schveighoffer <schveiguy@yahoo.com> 2010-05-17 06:34:35 PDT --- *** Issue 4199 has been marked as a duplicate of this issue. *** -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- |
Copyright © 1999-2021 by the D Language Foundation