This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/37947] New: p->count += inc(p); // value of p->count is wrong, if inc(p) not only returns an int but also increases p->counter
- From: "micirio at gmx dot net" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 29 Oct 2008 01:28:41 -0000
- Subject: [Bug c/37947] New: p->count += inc(p); // value of p->count is wrong, if inc(p) not only returns an int but also increases p->counter
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
The following programm prints out "1", it should print "4" (like it does with
gcc-3.3.6:
// Start of test.c
#include <stdlib.h>
#include <stdio.h>
struct test
{
unsigned long counter;
};
unsigned long inc(struct test *tp)
{
tp->counter += 3;
return 1;
}
int main()
{
struct test *p;
p = (struct test*) malloc(sizeof(struct test));
p->counter = 0;
p->counter += inc(p);
printf("%ld\n", p->counter);
free(p);
return 0;
}
// End of test.c
The following programm is not affected and prints out "4":
// Start of test2.c
#include <stdlib.h>
#include <stdio.h>
unsigned long inc(unsigned long *c)
{
*c += 3;
return 1;
}
int main()
{
unsigned long counter;
counter = 0;
counter += inc(&counter);
printf("%ld\n", counter);
return 0;
}
// End of test2.c
// Start output of "gcc -v -save-temps -Wall test.c"
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with:
/home/portage/portage/sys-devel/gcc-4.1.2/work/gcc-4.1.2/configure
--prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.1.2
--includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include
--datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2
--mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2/man
--infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2/info
--with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4
--host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec
--enable-nls --without-included-gettext --with-system-zlib --disable-checking
--disable-werror --enable-secureplt --disable-libunwind-exceptions
--disable-multilib --enable-libmudflap --disable-libssp --enable-java-awt=gtk
--with-arch=i686 --enable-languages=c,c++,java,treelang,fortran --enable-shared
--enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu
--with-bugurl=http://bugs.gentoo.org/ --with-pkgversion=Gentoo 4.1.2 p1.1
Thread model: posix
gcc version 4.1.2 (Gentoo 4.1.2 p1.1)
/usr/libexec/gcc/i686-pc-linux-gnu/4.1.2/cc1 -E -quiet -v test.c -march=i686
-Wall -fpch-preprocess -o test.i
ignoring nonexistent directory "/usr/local/include"
ignoring nonexistent directory
"/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include
/usr/include
End of search list.
/usr/libexec/gcc/i686-pc-linux-gnu/4.1.2/cc1 -fpreprocessed test.i -quiet
-dumpbase test.c -march=i686 -auxbase test -Wall -version -o test.s
GNU C version 4.1.2 (Gentoo 4.1.2 p1.1) (i686-pc-linux-gnu)
compiled by GNU C version 4.1.2 (Gentoo 4.1.2 p1.1).
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: db0ff7bf11ec8c21ed7c44c88f5253be
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../i686-pc-linux-gnu/bin/as -V
-Qy -o test.o test.s
GNU assembler version 2.18 (i686-pc-linux-gnu) using BFD version (GNU Binutils)
2.18
/usr/libexec/gcc/i686-pc-linux-gnu/4.1.2/collect2 --eh-frame-hdr -m elf_i386
-dynamic-linker /lib/ld-linux.so.2
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crt1.o
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crti.o
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/crtbegin.o
-L/usr/lib/gcc/i686-pc-linux-gnu/4.1.2 -L/usr/lib/gcc/i686-pc-linux-gnu/4.1.2
-L/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../i686-pc-linux-gnu/lib
-L/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../.. test.o -lgcc --as-needed
-lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/crtend.o
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../crtn.o
// End output of "gcc -v -save-temps -Wall test.c"
--
Summary: p->count += inc(p); // value of p->count is wrong, if
inc(p) not only returns an int but also increases p-
>counter
Product: gcc
Version: 4.1.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: micirio at gmx dot net
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37947