[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#350636: code that reproduces the bug and more info



I was able to reproduce the bug with the following code
(compile: g++ -Wall -O2 x.cpp)



#include <stdio.h>
#include <fstream>

typedef unsigned int Uint32;

inline Uint32 read_u32(std::istream& in)
{
	Uint32 i;
	in.read((char*)&i, 4);
	return i;
}

inline float read_float(std::istream& in)
{
	Uint32 u = read_u32(in);
	return *(float*)(&u);
}

int main()
{
	std::ifstream in("test");
	for (int i = 0; i < 2; ++i) {
		float x = read_float(in);
		float y = read_float(in);
		float z = read_float(in);
		printf("x=%f y=%f z=%f\n", x, y, z);
	}
	return 0;
}




with this test file:
(hexdump test)
(2x the float values 1.0, nearly 1.0, and -1)

0000000 0000 3f80 ffff 3f7f 0000 bf80 0000 3f80
0000010 ffff 3f7f 0000 bf80



the output is:
x=0.000000 y=1.000000 z=1.000000
x=-1.000000 y=1.000000 z=1.000000


which is clearly wrong. the first x should be 1.0
In fact the values for x,y,z are all wrong, because the stored values
are 1,1,-1 in that order, not -1,1,1.

Compiling the code with -O1 gives the correct output.

Seems to have something to do with parameter order on the printf call or
something the like.
Hope this helps...






Reply to: