This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug c++/23545] New: wrong arguments are given to a funtion


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]