BUG: Filebuf overflow() and underflow() Call filebuf::sync() (184236)



The information in this article applies to:

  • Microsoft Visual C++ 4.0
  • Microsoft Visual C++ 4.0a
  • Microsoft Visual C++ 4.1
  • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
  • Microsoft Visual C++, 32-bit Professional Edition 4.2
  • Microsoft Visual C++, 32-bit Professional Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 6.0
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET (2003)
  • Microsoft Visual C++ .NET (2002)

This article was previously published under Q184236

SYMPTOMS

The filebuf class allows you to use buffered file input/output (I/O), and provides the sync() function to flush the file buffers. However, the filebuf::overflow() and filebuf::underflow() functions do not support the use of virtual functions in the filebuf class. Classes derived from filebuf might incorrectly call filebuf::sync() when they should call the sync() function from the derived class.

CAUSE

The filebuf class calls filebuf::sync() instead of calling sync().

RESOLUTION

You can use one of the following workarounds to this problem:
  • Do not define the virtual function sync() in your filebuf-derived class.

    -or-

    define your own versions of overflow() and underflow() in the derived class.
  • Change the filebuf::overflow() and filebuf::underflow() functions to call sync() instead of filebuf::sync(). You can find the source code for filebuf class functions in the following location:
    ...\VC\Src\FileBuf.cpp
    						
    The source code for filebuf::overflow() follows:
          int filebuf::overflow(int c)
          {
              if (allocate()==EOF)
                  return EOF;
              if (filebuf::sync()==EOF) // Change to sync() for the workaround.
                  return EOF;
    
              if (!unbuffered())
                  setp(base(),ebuf());
              if (c!=EOF)
                  {
                  if ((!unbuffered()) && (pptr() < epptr()))
                      sputc(c);
                  else
                      {
                      if (_write(x_fd,&c,1)!=1)
                          return(EOF);
                      }
                  }
              return(1);
         }

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

MORE INFORMATION


Modification Type:MajorLast Reviewed:1/6/2004
Keywords:kbBug kbcode kbLangCPP kbpending KB184236 kbAudDeveloper