Hello.  I'm not on the list, so please CC me with any replies.

I have come across a bug found during some code which serializes
doubles.  The bug is only encountered when the optimization level is set
to -O2 or greater.

The bug is not encountered when compiled under
        gcc (GCC) 3.3.3 20040412 (Red Hat Linux 3.3.3-7)
at any optimization level.

The de-serialization code is:

typedef unsigned char uint8;
static uint8 next_byte(uint &offset, std::vector<uint8> const &bytecode)
   throw (std::invalid_argument)
{
   if (offset >= bytecode.size())
      throw (std::invalid_argument("Unexpected end of bytecode"));
   return bytecode[offset++];
}

double parse_double(uint &offset, std::vector<unsigned char> const &bytecode)
   throw (std::invalid_argument)
{
   typedef unsigned long long uint64;
   uint64 rtn = uint64(next_byte(offset, bytecode)) << 56;
   rtn |= uint64(next_byte(offset, bytecode)) << 48;
   rtn |= uint64(next_byte(offset, bytecode)) << 40;
   rtn |= uint64(next_byte(offset, bytecode)) << 32;
   rtn |= uint64(next_byte(offset, bytecode)) << 24;
   rtn |= uint64(next_byte(offset, bytecode)) << 16;
   rtn |= uint64(next_byte(offset, bytecode)) << 8;
   rtn |= uint64(next_byte(offset, bytecode));
   return *reinterpret_cast<double*>(&rtn);
}

Full source code to a demonstration of the bug, and a Makefile is at
        http://mjfrazer.org/~mjfrazer/tmp/pack-test/
The tar file in the directory contains all the other files, so you just
need to grab that.

cheers
-mark

Reply via email to