Article: Q184236
Product(s): Microsoft C Compiler
Version(s): 4.0,4.0a,4.1,4.2,5.0,6.0
Operating System(s):
Keyword(s): kbcode kbLangCPP kbVC kbVC400bug kbVC410bug kbVC420bug kbVC500bug kbVC600bug
Last Modified: 07-FEB-2002
-------------------------------------------------------------------------------
The information in this article applies to:
- Microsoft Visual C++, versions 4.0, 4.0a, 4.1
- Microsoft Visual C++, 32-bit Enterprise Edition, versions 4.2, 5.0, 6.0
- Microsoft Visual C++, 32-bit Professional Edition, versions 4.2, 5.0, 6.0
- Microsoft Visual C++, 32-bit Learning Edition, version 6.0
- Microsoft Visual C++.NET (2002)
-------------------------------------------------------------------------------
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
================
(c) 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
Technology : kbVCsearch kbVC400 kbAudDeveloper kbVC410 kbVC420 kbVC500 kbVC600 kbVC32bitSearch kbVC400a kbVCNET kbVC500Search
Version : :4.0,4.0a,4.1,4.2,5.0,6.0
Issue type : kbbug
Solution Type : kbpending
=============================================================================