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

ID: Q184236


The information in this article applies to:
  • Microsoft Visual C++, 32-bit Editions, versions 4.0, 4.0a, 4.1, 4.2, 5.0, 6.0


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

© Microsoft Corporation 1999, All Rights Reserved.
Contributions by Mark Hagen, Microsoft Corporation

Additional query words: inheritance inherit

Keywords : kbcode kbLangCPP kbVC kbVC400bug kbVC410bug kbVC420bug kbVC500bug kbVC600bug
Version : winnt:4.0,4.0a,4.1,4.2,5.0,6.0
Platform : winnt
Issue type : kbbug


Last Reviewed: July 14, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.