[vtk-developers] VTK tickles compiler bug for Altix, gcc 3.3.3

Hank Childs childs3 at llnl.gov
Fri Jul 28 11:07:57 EDT 2006

Hi Folks,

I ran into an issue recently where there appeared to be a bug in the VTK 
library, but I believe was actually a compiler bug.  I don't really have a 
good fix (I believe it is good VTK code).  Regardless, I am reporting it to 
this list in case others encounter it.  

This is for Altix using g++ 3.3.3.

I found that when serializing a data set and writing it to a socket, the 
reader was crashing.  After a lot of digging, I found that the vtkByteSwap 
module was producing garbage the first time it was invoked.  I am speculating 
that there was some sort of hazard.

Searching for an easy fix, I modified vtkByteSwap.cxx's method
   template <class T>
   inline void vtkByteSwapRangeWrite(const T* first, vtkIdType num,
                                     ostream* os, long)
  (located at ~line 130)


  for(const T* p=first; p != last; ++p)
    T temp = *p;
    os->write((char*)&temp, sizeof(temp));


    for(const T* p=first; p != last; ++p)
    T temp = *p;
    T temp2 = *p;
    if (temp != temp2)
        cerr << "A COMPILER BUG HAS BEEN EXPOSED" << endl;
    os->write((char*)&temp, sizeof(temp));

So everyone should be weary when a developer thinks they have found a compiler 
bug.  In this case, I was pretty certain that it was a compiler bug, because 
placing print statements in certain regions of the code caused the byte 
swapper code to work.  The final code is a bit funny ... it calls the same 
method twice (inefficiency, I know) and then checks to make sure that the 
results are the same.  If you call twice and check to see if they are the 
same, it always works (i.e. the print statement won't execute).  If you call 
once (i.e. the original code), it will produce garbage the first time.



Hank Childs
Lawrence Livermore National Laboratory

phone: (925) 422-4035
email: childs3 at llnl.gov

More information about the vtk-developers mailing list