>Number: 7591 >Category: optimization >Synopsis: function-related struct copy bug >Confidential: no >Severity: serious >Priority: medium >Responsible: unassigned >State: open >Class: sw-bug >Submitter-Id: net >Arrival-Date: Tue Aug 13 15:56:00 PDT 2002 >Closed-Date: >Last-Modified: >Originator: http://www.linuxfromscratch.org/ development team >Release: unknown-1.0 >Organization: >Environment: System: Linux valhalla 2.4.18-1 #4 Mon Jun 10 22:08:58 CDT 2002 i686 AuthenticAMD Architecture: i686 host: i386-incept-linux-gnu build: i386-incept-linux-gnu target: i386-incept-linux-gnu configured with: ../gcc-3.1.1/configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-version-specific-runtime-libs --enable-threads=posix --enable-languages=c,c++ --enable-shared --with-system-zlib --with-__cxa_atexit --host=i386-incept-linux-gnu --target=i386-incept-linux-gnu --build=i386-incept-linux-gnu >Description: Ok, I'm now posting this as an official bug. gcc 3.1 and higher (including current CVS HEAD aka gcc-3.3) have a problem passing structs (not struct pointers) to functions when those structs contain static char arrays, and -march=i686 or higher is used (-march=athlon-{xp,mp} seems to be exempt for some reason, though -march=athlon is affected). Basically, the struct that the function receives has garbage contents. Structs with static arrays of other types (such as int or float) do not seem to trigger this bug. >How-To-Repeat: Below is a small testcase (same .c file that was used to generate the attached .i file). --Begin testcase.c-- #include struct abba { char str[128]; }; void test(struct abba ke) { printf("%s\n", ke.str); } int main() { struct abba ke; strcpy(ke.str, "DOH"); test(ke); } --End testcase.c-- [ root@valhalla /usr/src ] # gcc -O2 -march=i686 \ testcase.c -o testcase [ root@valhalla /usr/src ] # ./testcase ج@`ûÿ¿¨G@`a @ÈØ@8K@7û@Xýÿ¿/ [ root@valhalla /usr/src ] # gcc -O2 -march=i486 \ testcase.c -o testcase [ root@valhalla /usr/src ] # ./testcase DOH [ root@valhalla /usr/src ] # gcc -march=i686 testcase.c \ -o testcase [ root@valhalla /usr/src ] # ./testcase ûÿ¿¨G@`a @ÈØ@8K@7û@Xýÿ¿/ >Fix: I know of no real fix for this problem. It has been suggested that -maccumulate-outgoing-args triggers the problem. Code which wishes to step around the bug should not pass structs in function headers anyways, but rather use const struct pointers, and make a copy of the struct inside the function if modifications are necessary. Most code does this already as a practice of good coding style, but there are some notable exceptions (primarily loadkeys in kbd-1.06). >Release-Note: >Audit-Trail: >Unformatted: ----gnatsweb-attachment---- Content-Type: application/x-gzip; name="testcase.i.gz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="testcase.i.gz" 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