This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c++/23545] New: wrong arguments are given to a funtion
- From: "sarholz at rz dot rwth-aachen dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 24 Aug 2005 09:04:28 -0000
- Subject: [Bug c++/23545] New: wrong arguments are given to a funtion
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
Compiling the example g++ generates wrong code. I tried 5 other compiler from
different vendors and they generated an correct executable.
I tried different versions of the GNU Compiler, different Linux distributions
and plattforms.
All GNU compiler gave the same wrong results.
Using a debugger one can see the the arguments given to the function dimRand are
wrong.
The Output of the program should be:
9 CPs in this Block
CP added at 27 16 12
CP added at 16 19 19
CP added at 17 27 29
CP added at 13 35 0
CP added at 15 37 32
CP added at 24 27 44
CP added at 6 5 3
CP added at 20 18 5
CP added at 14 20 23
Compiled with the GNU g++ compiler the output is:
9 CPs in this Block
CP added at 7 16 45
CP added at 11 19 27
CP added at 17 27 30
CP added at 0 35 22
CP added at 19 37 26
CP added at 26 27 42
CP added at 2 5 10
CP added at 3 18 34
CP added at 14 20 24
The used command line was:
$ g++ -v -save-temps FlowFieldGenerator.cpp -o test.exe -DDEBUG -Wall -g
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --enable-shared --enable-threads=posix
--enable-checking=release --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-libgcj-multifile
--enable-languages=c,c++,objc,java,f95,ada --enable-java-awt=gtk
--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre --host=i386-redhat-linux
Thread model: posix
gcc version 4.0.1 20050727 (Red Hat 4.0.1-5)
/usr/libexec/gcc/i386-redhat-linux/4.0.1/cc1plus -E -quiet -v -D_GNU_SOURCE
-DDEBUG FlowFieldGenerator.cpp -Wall -fworking-directory -fpch-preprocess -o
FlowFieldGenerator.ii
ignoring nonexistent directory
"/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../i386-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/i386-redhat-linux
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../../include/c++/4.0.1/backward
/usr/local/include
/usr/lib/gcc/i386-redhat-linux/4.0.1/include
/usr/include
End of search list.
/usr/libexec/gcc/i386-redhat-linux/4.0.1/cc1plus -fpreprocessed
FlowFieldGenerator.ii -quiet -dumpbase FlowFieldGenerator.cpp -auxbase
FlowFieldGenerator -g -Wall -version -o FlowFieldGenerator.s
GNU C++ version 4.0.1 20050727 (Red Hat 4.0.1-5) (i386-redhat-linux)
compiled by GNU C version 4.0.1 20050727 (Red Hat 4.0.1-5).
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
as -V -Qy -o FlowFieldGenerator.o FlowFieldGenerator.s
GNU assembler version 2.15.94.0.2.2 (i386-redhat-linux) using BFD version
2.15.94.0.2.2 20041220
/usr/libexec/gcc/i386-redhat-linux/4.0.1/collect2 --eh-frame-hdr -m elf_i386
-dynamic-linker /lib/ld-linux.so.2 -o test.exe
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../crt1.o
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../crti.o
/usr/lib/gcc/i386-redhat-linux/4.0.1/crtbegin.o
-L/usr/lib/gcc/i386-redhat-linux/4.0.1 -L/usr/lib/gcc/i386-redhat-linux/4.0.1
-L/usr/lib/gcc/i386-redhat-linux/4.0.1/../../.. FlowFieldGenerator.o -lstdc++
-lm -lgcc_s -lgcc -lc -lgcc_s -lgcc
/usr/lib/gcc/i386-redhat-linux/4.0.1/crtend.o
/usr/lib/gcc/i386-redhat-linux/4.0.1/../../../crtn.o
Since I am not sure where to append the soure I will put in in here.
The Source Code of FlowFieldGenerator.cpp:
/*============================================================================*/
/* INCLUDES */
/*============================================================================*/
#include "FlowFieldGenerator.h"
//#include <vector>
#include <iostream>
/*============================================================================*/
// MAKROS / DEFINES
/*============================================================================*/
using namespace std;
#define SRANDOM_MAX 16777216
/*============================================================================*/
/* CONSTRUCTORS / DESTRUCTOR */
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
static unsigned long long nextrandom = 1;
long long simplerandom(void) {
nextrandom = nextrandom * 1103515245 + 12345;
return((unsigned)(nextrandom/64) % SRANDOM_MAX);
}
void seedsimplerandom(unsigned seed) {
nextrandom = seed;
}
int main ()
{
CStrangeFieldFunction field(30,40,50);
}
CStrangeFieldFunction::CStrangeFieldFunction()
{
walkx = 0.0;
walky = 0.0;
walkz = 0.0;
stepsize = 0.01;
xDim=1;
yDim=1;
zDim=1;
}
inline int CStrangeFieldFunction::dimRand(int dim)
{
unsigned long long tmp = simplerandom();
tmp *= dim-1;
tmp /= SRANDOM_MAX;
return tmp;
}
CStrangeFieldFunction::CStrangeFieldFunction(int x, int y, int z)
{
array = new double [x*y*z*3];
xDim=x;
yDim=y;
zDim=z;
// init array
for (long int i =0; i < x*y*z*3; ++i)
{
array[i] = ((double)simplerandom())/SRANDOM_MAX;
}
// add critical points to random positions
long long tmpint = y*z * simplerandom() / SRANDOM_MAX / 100;
std::cout << tmpint << " CPs in this Block\n";
for (int j = 0; j < tmpint; ++j) // don't depend linear on the number of cells,
so no x
{
// gcc 3.3.5 3.4.4 4.0.0 4.0.1 has a bug here. dimRand is called with wrong value
GenCP (dimRand(xDim), dimRand(yDim), dimRand(zDim));
}
//GenCP (1, 1 , 1);
}
CStrangeFieldFunction::~CStrangeFieldFunction()
{
if (array)
{
delete [] array;
}
}
void CStrangeFieldFunction::GenCP (int x, int y, int z)
{
#ifdef DEBUG
cout << "CP added at " << x << " " << y << " " << z << "\n";
#endif
//id 0
array [3*yDim*xDim* z + 3*xDim*y + 3*x + 0] += 1;
array [3*yDim*xDim* z + 3*xDim*y + 3*x + 1] += 1;
array [3*yDim*xDim* z + 3*xDim*y + 3*x + 2] += 1;
//id 1
array [3*yDim*xDim* z + 3*xDim*y + 3*(x+1) + 0] += 1;
array [3*yDim*xDim* z + 3*xDim*y + 3*(x+1) + 1] += -1;
array [3*yDim*xDim* z + 3*xDim*y + 3*(x+1) + 2] += 1;
//id 2
array [3*yDim*xDim* z + 3*xDim*(y+1) + 3*(x+1) + 0] += 1;
array [3*yDim*xDim* z + 3*xDim*(y+1) + 3*(x+1) + 1] += -1;
array [3*yDim*xDim* z + 3*xDim*(y+1) + 3*(x+1) + 2] += -1;
//id 3
array [3*yDim*xDim* z + 3*xDim*(y+1) + 3*x + 0] += 1;
array [3*yDim*xDim* z + 3*xDim*(y+1) + 3*x + 1] += 1;
array [3*yDim*xDim* z + 3*xDim*(y+1) + 3*x + 2] += -1;
//id 4
array [3*yDim*xDim* (z+1) + 3*xDim*y + 3*x + 0] += -1;
array [3*yDim*xDim* (z+1) + 3*xDim*y + 3*x + 1] += 1;
array [3*yDim*xDim* (z+1) + 3*xDim*y + 3*x + 2] += 1;
//id 5
array [3*yDim*xDim* (z+1) + 3*xDim*y + 3*(x+1) + 0] += -1;
array [3*yDim*xDim* (z+1) + 3*xDim*y + 3*(x+1) + 1] += -1;
array [3*yDim*xDim* (z+1) + 3*xDim*y + 3*(x+1) + 2] += 1;
//id 6
array [3*yDim*xDim* (z+1) + 3*xDim*(y+1) + 3*(x+1) + 0] += -1;
array [3*yDim*xDim* (z+1) + 3*xDim*(y+1) + 3*(x+1) + 1] += -1;
array [3*yDim*xDim* (z+1) + 3*xDim*(y+1) + 3*(x+1) + 2] += -1;
//id 7
array [3*yDim*xDim* (z+1) + 3*xDim*(y+1) + 3*x + 0] += -1;
array [3*yDim*xDim* (z+1) + 3*xDim*(y+1) + 3*x + 1] += 1;
array [3*yDim*xDim* (z+1) + 3*xDim*(y+1) + 3*x + 2] += -1;
}
/*============================================================================*/
/* NAME : RandomWalk */
/*============================================================================*/
inline void CStrangeFieldFunction::RandomWalk (double * walk)
{
double x = simplerandom()*2/SRANDOM_MAX ; // Random number 0 to 1
if (x > 0.5)
{
(*walk) += stepsize;
}
else
{
(*walk) -= stepsize;
}
return;
}
/*============================================================================*/
/* NAME : ComputeValueX */
/*============================================================================*/
double CStrangeFieldFunction::ComputeValueX (double xPos, double yPos, double zPos)
{
RandomWalk (&walkx);
int x = (int) xPos;
int y = (int) yPos;
int z = (int) zPos;
return array [3*yDim*xDim* z + 3*xDim*y + 3*x + 0];
}
/*============================================================================*/
/* NAME : ComputeValueY */
/*============================================================================*/
double CStrangeFieldFunction::ComputeValueY (double xPos, double yPos, double zPos)
{
int x = (int) xPos;
int y = (int) yPos;
int z = (int) zPos;
return array [3*yDim*xDim* z + 3*xDim*y + 3*x + 1];
}
/*============================================================================*/
/* NAME : ComputeValueZ */
/*============================================================================*/
double CStrangeFieldFunction::ComputeValueZ (double xPos, double yPos, double zPos)
{
int x = (int) xPos;
int y = (int) yPos;
int z = (int) zPos;
return array [3*yDim*xDim* z + 3*xDim*y + 3*x + 2];
}
/*============================================================================*/
/* NAME : ComputeScalar */
/*============================================================================*/
double CStrangeFieldFunction::ComputeScalar (double xPos, double yPos, double zPos)
{
int x = (int) xPos;
int y = (int) yPos;
int z = (int) zPos;
return array [3*yDim*xDim* z + 3*xDim*y + 3*x + 0] + array [3*yDim*xDim* z
+ 3*xDim*y + 3*x + 1] + array [3*yDim*xDim* z + 3*xDim*y + 3*x + 2];
}
/*============================================================================*/
The source of FlowFieldGenerator.h
#if !defined(__FLOWFIELDGENERATOR_H)
#define __FLOWFIELDGENERATOR_H
#ifdef WIN32
#pragma warning( disable : 4786 )
#endif
/*============================================================================*/
// INCLUDES
/*============================================================================*/
#include <string>
#include <vector>
/*============================================================================*/
// MAKROS / DEFINES
/*============================================================================*/
/*============================================================================*/
/* FORWARD DECLARATIONS */
/*============================================================================*/
/*============================================================================*/
/* CLASS DEFINITIONS */
/*============================================================================*/
/**
* CStrangeFieldFunction
*
* @AUTHOR Samuel Sarholz
* @DATE 10.8.2005
*/
class CStrangeFieldFunction
{
public:
CStrangeFieldFunction();
CStrangeFieldFunction(int x, int y, int z);
~CStrangeFieldFunction();
double ComputeValueX (double xPos, double yPos, double zPos);
double ComputeValueY (double xPos, double yPos, double zPos);
double ComputeValueZ (double xPos, double yPos, double zPos);
double ComputeScalar (double xPos, double yPos, double zPos);
private:
double walkx;
double walky;
double walkz;
double stepsize;
double *array;
int xDim, yDim, zDim;
void GenCP (int x, int y, int z);
inline void RandomWalk (double * walk);
inline int dimRand(int dim);
};
#endif // __FLOWFIELDGENERATOR_H
/*============================================================================*/
/* END OF FILE "FlowFieldGenerator.h" */
/*============================================================================*/
--
Summary: wrong arguments are given to a funtion
Product: gcc
Version: 4.0.1
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: sarholz at rz dot rwth-aachen dot de
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23545