You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@stdcxx.apache.org by Farid Zaripov <Fa...@epam.com> on 2007/10/17 18:04:19 UTC

difference in exported symbols between 4.1.3 and 4.2.0 15d dll's (MSVC 7.1)

  Below is the difference in exported symbols between 4.1.3 and 4.2.0
15d dll's (MSVC 7.1).
I've removed the symbols, which appears in 4.2.0 dll but not exist in
4.1.3 dll.

***** stdlib15d.dll.4.1.3
public: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
***** libstd15d.dll.4.2.0
protected: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
*****

***** stdlib15d.dll.4.1.3
public: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
***** libstd15d.dll.4.2.0
protected: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
*****

***** stdlib15d.dll.4.1.3
private: unsigned int __thiscall std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
int,unsigned int)const 
private: unsigned int __thiscall std::basic_string<unsigned short,struct
std::char_traits<unsigned short>,class std::allocator<unsigned short>
>::_C_grow(unsigned int,unsigned int)const 
private: int __thiscall std::basic_stringbuf<char,struct
std::char_traits<char>,class std::allocator<char>
>::_C_grow(int,int)const 
private: int __thiscall std::basic_stringbuf<unsigned short,struct
std::char_traits<unsigned short>,class std::allocator<unsigned short>
>::_C_grow(int,int)const 
***** libstd15d.dll.4.2.0
public: unsigned int __thiscall std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
int,unsigned int)const 
public: unsigned int __thiscall std::basic_string<unsigned short,struct
std::char_traits<unsigned short>,class std::allocator<unsigned short>
>::_C_grow(unsigned int,unsigned int)const 
private: int __thiscall std::basic_stringbuf<char,struct
std::char_traits<char>,class std::allocator<char> >::_C_grow(int)const 
private: int __thiscall std::basic_stringbuf<unsigned short,struct
std::char_traits<unsigned short>,class std::allocator<unsigned short>
>::_C_grow(int)const 
*****

***** stdlib15d.dll.4.1.3
protected: int __thiscall std::basic_streambuf<char,struct
std::char_traits<char> >::_C_putback_avail(void)const 
protected: int __thiscall std::basic_streambuf<unsigned short,struct
std::char_traits<unsigned short> >::_C_putback_avail(void)const 
***** libstd15d.dll.4.2.0
protected: unsigned int __thiscall std::basic_streambuf<char,struct
std::char_traits<char> >::_C_putback_avail(void)const 
protected: unsigned int __thiscall std::basic_streambuf<unsigned
short,struct std::char_traits<unsigned short>
>::_C_putback_avail(void)const 
*****

***** stdlib15d.dll.4.1.3
protected: int __thiscall std::basic_streambuf<char,struct
std::char_traits<char> >::_C_write_avail(void)const 
protected: int __thiscall std::basic_streambuf<unsigned short,struct
std::char_traits<unsigned short> >::_C_write_avail(void)const 
***** libstd15d.dll.4.2.0
protected: unsigned int __thiscall std::basic_streambuf<char,struct
std::char_traits<char> >::_C_write_avail(void)const 
protected: unsigned int __thiscall std::basic_streambuf<unsigned
short,struct std::char_traits<unsigned short>
>::_C_write_avail(void)const 
*****

***** stdlib15d.dll.4.1.3
public: __thiscall bad_cast::bad_cast(class bad_cast const &)
public: __thiscall bad_typeid::bad_typeid(class bad_typeid const &)
public: __thiscall exception::exception(class exception const &)
public: __thiscall exception::exception(void)
public: virtual __thiscall bad_cast::~bad_cast(void)
public: virtual __thiscall bad_typeid::~bad_typeid(void)
public: virtual __thiscall exception::~exception(void)
public: class bad_cast & __thiscall bad_cast::operator=(class bad_cast
const &)
public: class bad_typeid & __thiscall bad_typeid::operator=(class
bad_typeid const &)
public: class exception & __thiscall exception::operator=(class
exception const &)
const exception::`vftable'
protected: int __thiscall std::basic_stringbuf<char,struct
std::char_traits<char>,class std::allocator<char>
>::_C_strlen(void)const 
protected: int __thiscall std::basic_stringbuf<unsigned short,struct
std::char_traits<unsigned short>,class std::allocator<unsigned short>
>::_C_strlen(void)const 
public: class std::basic_string<char,struct std::char_traits<char>,class
std::allocator<char> > & __thiscall std::basic_string<char,struct
std::char_traits<char>,class std::allocator<char> >::insert(unsigned
int,unsigned int,char)
public: class std::basic_string<unsigned short,struct
std::char_traits<unsigned short>,class std::allocator<unsigned short> >
& __thiscall std::basic_string<unsigned short,struct
std::char_traits<unsigned short>,class std::allocator<unsigned short>
>::insert(unsigned int,unsigned int,unsigned short)
public: virtual char const * __thiscall exception::what(void)const 
***** libstd15d.dll.4.2.0
*****

***** stdlib15d.dll.4.1.3
double const __rw::__rw_dbl_denorm_min
double const __rw::__rw_dbl_infinity
double const __rw::__rw_dbl_qNaN
double const __rw::__rw_dbl_sNaN
float const __rw::__rw_flt_denorm_min
float const __rw::__rw_flt_infinity
float const __rw::__rw_flt_qNaN
float const __rw::__rw_flt_sNaN
long double const __rw::__rw_ldbl_denorm_min
long double const __rw::__rw_ldbl_infinity
long double const __rw::__rw_ldbl_qNaN
long double const __rw::__rw_ldbl_sNaN
***** libstd15d.dll.4.2.0
__rw_dbl_denorm_min
__rw_dbl_infinity
__rw_dbl_qNaN
__rw_dbl_sNaN
__rw_flt_denorm_min
__rw_flt_infinity
__rw_flt_qNaN
__rw_flt_sNaN
__rw_ldbl_denorm_min
__rw_ldbl_infinity
__rw_ldbl_qNaN
__rw_ldbl_sNaN
__rw_once
*****

Farid.

Re: difference in exported symbols between 4.1.3 and 4.2.0 15d dll's (MSVC 7.1)

Posted by Martin Sebor <se...@roguewave.com>.
Travis, if you still have the email I sent you privately last night
with the links to the svn changes for the incompatibilities below,
can you pass those on? I can't access the email from where I am
right now and having the details might be helpful in deciding if
we should try to fix the problems or go with plan (B), i.e.,
declare the library incompatible on Windows.

Thanks
Martin

Farid Zaripov wrote:
>   Below is the difference in exported symbols between 4.1.3 and 4.2.0
> 15d dll's (MSVC 7.1).
> I've removed the symbols, which appears in 4.2.0 dll but not exist in
> 4.1.3 dll.
> 
> ***** stdlib15d.dll.4.1.3
> public: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
> ***** libstd15d.dll.4.2.0
> protected: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
> *****
> 
> ***** stdlib15d.dll.4.1.3
> public: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
> ***** libstd15d.dll.4.2.0
> protected: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
> *****
> 
> ***** stdlib15d.dll.4.1.3
> private: unsigned int __thiscall std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
> int,unsigned int)const 
> private: unsigned int __thiscall std::basic_string<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_grow(unsigned int,unsigned int)const 
> private: int __thiscall std::basic_stringbuf<char,struct
> std::char_traits<char>,class std::allocator<char>
>> ::_C_grow(int,int)const 
> private: int __thiscall std::basic_stringbuf<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_grow(int,int)const 
> ***** libstd15d.dll.4.2.0
> public: unsigned int __thiscall std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
> int,unsigned int)const 
> public: unsigned int __thiscall std::basic_string<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_grow(unsigned int,unsigned int)const 
> private: int __thiscall std::basic_stringbuf<char,struct
> std::char_traits<char>,class std::allocator<char> >::_C_grow(int)const 
> private: int __thiscall std::basic_stringbuf<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_grow(int)const 
> *****
> 
> ***** stdlib15d.dll.4.1.3
> protected: int __thiscall std::basic_streambuf<char,struct
> std::char_traits<char> >::_C_putback_avail(void)const 
> protected: int __thiscall std::basic_streambuf<unsigned short,struct
> std::char_traits<unsigned short> >::_C_putback_avail(void)const 
> ***** libstd15d.dll.4.2.0
> protected: unsigned int __thiscall std::basic_streambuf<char,struct
> std::char_traits<char> >::_C_putback_avail(void)const 
> protected: unsigned int __thiscall std::basic_streambuf<unsigned
> short,struct std::char_traits<unsigned short>
>> ::_C_putback_avail(void)const 
> *****
> 
> ***** stdlib15d.dll.4.1.3
> protected: int __thiscall std::basic_streambuf<char,struct
> std::char_traits<char> >::_C_write_avail(void)const 
> protected: int __thiscall std::basic_streambuf<unsigned short,struct
> std::char_traits<unsigned short> >::_C_write_avail(void)const 
> ***** libstd15d.dll.4.2.0
> protected: unsigned int __thiscall std::basic_streambuf<char,struct
> std::char_traits<char> >::_C_write_avail(void)const 
> protected: unsigned int __thiscall std::basic_streambuf<unsigned
> short,struct std::char_traits<unsigned short>
>> ::_C_write_avail(void)const 
> *****
> 
> ***** stdlib15d.dll.4.1.3
> public: __thiscall bad_cast::bad_cast(class bad_cast const &)
> public: __thiscall bad_typeid::bad_typeid(class bad_typeid const &)
> public: __thiscall exception::exception(class exception const &)
> public: __thiscall exception::exception(void)
> public: virtual __thiscall bad_cast::~bad_cast(void)
> public: virtual __thiscall bad_typeid::~bad_typeid(void)
> public: virtual __thiscall exception::~exception(void)
> public: class bad_cast & __thiscall bad_cast::operator=(class bad_cast
> const &)
> public: class bad_typeid & __thiscall bad_typeid::operator=(class
> bad_typeid const &)
> public: class exception & __thiscall exception::operator=(class
> exception const &)
> const exception::`vftable'
> protected: int __thiscall std::basic_stringbuf<char,struct
> std::char_traits<char>,class std::allocator<char>
>> ::_C_strlen(void)const 
> protected: int __thiscall std::basic_stringbuf<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_strlen(void)const 
> public: class std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> > & __thiscall std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::insert(unsigned
> int,unsigned int,char)
> public: class std::basic_string<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short> >
> & __thiscall std::basic_string<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::insert(unsigned int,unsigned int,unsigned short)
> public: virtual char const * __thiscall exception::what(void)const 
> ***** libstd15d.dll.4.2.0
> *****
> 
> ***** stdlib15d.dll.4.1.3
> double const __rw::__rw_dbl_denorm_min
> double const __rw::__rw_dbl_infinity
> double const __rw::__rw_dbl_qNaN
> double const __rw::__rw_dbl_sNaN
> float const __rw::__rw_flt_denorm_min
> float const __rw::__rw_flt_infinity
> float const __rw::__rw_flt_qNaN
> float const __rw::__rw_flt_sNaN
> long double const __rw::__rw_ldbl_denorm_min
> long double const __rw::__rw_ldbl_infinity
> long double const __rw::__rw_ldbl_qNaN
> long double const __rw::__rw_ldbl_sNaN
> ***** libstd15d.dll.4.2.0
> __rw_dbl_denorm_min
> __rw_dbl_infinity
> __rw_dbl_qNaN
> __rw_dbl_sNaN
> __rw_flt_denorm_min
> __rw_flt_infinity
> __rw_flt_qNaN
> __rw_flt_sNaN
> __rw_ldbl_denorm_min
> __rw_ldbl_infinity
> __rw_ldbl_qNaN
> __rw_ldbl_sNaN
> __rw_once
> *****
> 
> Farid.


Re: [PATCH] std::string::_C_grow() 4.2 incompatibility

Posted by Martin Sebor <se...@roguewave.com>.
Martin Sebor wrote:
> Travis Vitek wrote:
>> Martin,
>>
>> That patch won't work. The _C_grow needs to be made private. It was
>> private in 4.1.3, but is public in 4.2. IMO it should always be private
>> and it was an oversight that under some conditions it could be made
>> public.
>>
>> I have tested the following patch.
> 
> I think they're the same as far as MSVC goes. Mine moves the
> public: above the conditional declaration of the __replace_aux()
> member template.

Crud! If the patch actually did what I said it would have been
good. Instead, I moved the public: *below* the conditional
declaration of __replace_aux(), thus making the member function
template private and inaccessible from the non-member function
__rw_replace_aux(), exactly what I was trying to avoid doing
in order to prevent breaking HP aCC. And sure enough, now that
I've tested it (but of course, not before checking it in), the
change breaks the compiler. Arrrgh!

Corrected as follows:
   http://svn.apache.org/viewvc?rev=586162&view=rev

Martin

> The block that includes the public declaration
> is disabled for MSVC 7 and up, so the private: specifier right
> above it is in effect. No?
> 
> The problem with your patch as I see it is that the
> __rw_replace_aux() (non-member) function template that's called
> from the __replace_aux() inline member template won't be able to
> access the (unconditionally) private _C_grow(). I think HP aCC
> on PA-RISC actually uses this block to work around a compiler
> bug (see http://issues.apache.org/jira/browse/STDCXX-271).
> 
> Martin
> 
>>
>>
>> Index: string
>> ===================================================================
>> --- string    (revision 585687)
>> +++ string    (working copy)
>> @@ -521,6 +521,8 @@
>>  
>>  #endif   // _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>>  
>> +private:
>> +
>>      size_type _C_grow (size_type, size_type) const;
>>  
>>  public:
>>
>>
>>
>>
>>
>>> -----Original Message-----
>>> From: Martin Sebor [mailto:sebor@roguewave.com] Sent: Wednesday, 
>>> October 17, 2007 3:13 PM
>>> To: stdcxx-dev@incubator.apache.org
>>> Subject: [PATCH] std::string::_C_grow() 4.2 incompatibility (was: Re: 
>>> difference in exported symbols between 4.1.3 and 4.2.0 15d dll's 
>>> (MSVC 7.1))
>>>
>>> Martin Sebor wrote:
>>>> Some more wisdom that I had snipped previously:
>>>>
>>>> Travis Vitek wrote:
>>>> [...]
>>>>  >
>>>>  > Note that the basic_string<>::_C_grow() method is not 
>>> accessed by any
>>>>  > inline member functions, but it still causes problems. I 
>>> don't think we
>>>>  > can skip fixing these problems just because a function 
>>> appears to not be
>>>>  > accessable to user code.
>>>>  >
>>>>
>>>> Ah, I know why! Because it's called from a member template which
>>>> gets instantiated in the test.
>>>>
>>>> So we need to add string::_C_grow() to the list of symbols to
>>>> fix in 4.2.0.
>>> Travis, can you try this patch?
>>>
>>> Index: include/string
>>> ===================================================================
>>> --- include/string      (revision 585584)
>>> +++ include/string      (working copy)
>>> @@ -504,8 +504,6 @@
>>>          return _C_make_iter (_C_data + __pos1);
>>>      }
>>>
>>> -public:
>>> -
>>>  #ifndef _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>>>
>>>      template <class _InputIter>
>>> @@ -519,6 +517,8 @@
>>>          return __rw_replace_aux (*this, __first1, __last1, __first2, 
>>> __last2);
>>>      }
>>>
>>> +public:
>>> +
>>>  #endif   // _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>>>
>>>      size_type _C_grow (size_type, size_type) const;
>>>
>>>
> 


RE: [PATCH] std::string::_C_grow() 4.2 incompatibility

Posted by Farid Zaripov <Fa...@epam.com>.
> -----Original Message-----
> From: Martin Sebor [mailto:sebor@roguewave.com] 
> Sent: Thursday, October 18, 2007 5:38 PM
> To: stdcxx-dev@incubator.apache.org
> Subject: Re: [PATCH] std::string::_C_grow() 4.2 incompatibility
> 
> I'm getting ready to commit the original patch -- Travis, do 
> you agree? Farid, any concerns or comments with it?

  The patch is ok.

Farid.

Re: [PATCH] std::string::_C_grow() 4.2 incompatibility

Posted by Martin Sebor <se...@roguewave.com>.
I'm getting ready to commit the original patch -- Travis,
do you agree? Farid, any concerns or comments with it?

Martin

Martin Sebor wrote:
> Travis Vitek wrote:
>> Martin,
>>
>> That patch won't work. The _C_grow needs to be made private. It was
>> private in 4.1.3, but is public in 4.2. IMO it should always be private
>> and it was an oversight that under some conditions it could be made
>> public.
>>
>> I have tested the following patch.
> 
> I think they're the same as far as MSVC goes. Mine moves the
> public: above the conditional declaration of the __replace_aux()
> member template. The block that includes the public declaration
> is disabled for MSVC 7 and up, so the private: specifier right
> above it is in effect. No?
> 
> The problem with your patch as I see it is that the
> __rw_replace_aux() (non-member) function template that's called
> from the __replace_aux() inline member template won't be able to
> access the (unconditionally) private _C_grow(). I think HP aCC
> on PA-RISC actually uses this block to work around a compiler
> bug (see http://issues.apache.org/jira/browse/STDCXX-271).
> 
> Martin
> 
>>
>>
>> Index: string
>> ===================================================================
>> --- string    (revision 585687)
>> +++ string    (working copy)
>> @@ -521,6 +521,8 @@
>>  
>>  #endif   // _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>>  
>> +private:
>> +
>>      size_type _C_grow (size_type, size_type) const;
>>  
>>  public:
>>
>>
>>
>>
>>
>>> -----Original Message-----
>>> From: Martin Sebor [mailto:sebor@roguewave.com] Sent: Wednesday, 
>>> October 17, 2007 3:13 PM
>>> To: stdcxx-dev@incubator.apache.org
>>> Subject: [PATCH] std::string::_C_grow() 4.2 incompatibility (was: Re: 
>>> difference in exported symbols between 4.1.3 and 4.2.0 15d dll's 
>>> (MSVC 7.1))
>>>
>>> Martin Sebor wrote:
>>>> Some more wisdom that I had snipped previously:
>>>>
>>>> Travis Vitek wrote:
>>>> [...]
>>>>  >
>>>>  > Note that the basic_string<>::_C_grow() method is not 
>>> accessed by any
>>>>  > inline member functions, but it still causes problems. I 
>>> don't think we
>>>>  > can skip fixing these problems just because a function 
>>> appears to not be
>>>>  > accessable to user code.
>>>>  >
>>>>
>>>> Ah, I know why! Because it's called from a member template which
>>>> gets instantiated in the test.
>>>>
>>>> So we need to add string::_C_grow() to the list of symbols to
>>>> fix in 4.2.0.
>>> Travis, can you try this patch?
>>>
>>> Index: include/string
>>> ===================================================================
>>> --- include/string      (revision 585584)
>>> +++ include/string      (working copy)
>>> @@ -504,8 +504,6 @@
>>>          return _C_make_iter (_C_data + __pos1);
>>>      }
>>>
>>> -public:
>>> -
>>>  #ifndef _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>>>
>>>      template <class _InputIter>
>>> @@ -519,6 +517,8 @@
>>>          return __rw_replace_aux (*this, __first1, __last1, __first2, 
>>> __last2);
>>>      }
>>>
>>> +public:
>>> +
>>>  #endif   // _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>>>
>>>      size_type _C_grow (size_type, size_type) const;
>>>
>>>
> 


Re: [PATCH] std::string::_C_grow() 4.2 incompatibility

Posted by Martin Sebor <se...@roguewave.com>.
Travis Vitek wrote:
> Martin,
> 
> That patch won't work. The _C_grow needs to be made private. It was
> private in 4.1.3, but is public in 4.2. IMO it should always be private
> and it was an oversight that under some conditions it could be made
> public.
> 
> I have tested the following patch.

I think they're the same as far as MSVC goes. Mine moves the
public: above the conditional declaration of the __replace_aux()
member template. The block that includes the public declaration
is disabled for MSVC 7 and up, so the private: specifier right
above it is in effect. No?

The problem with your patch as I see it is that the
__rw_replace_aux() (non-member) function template that's called
from the __replace_aux() inline member template won't be able to
access the (unconditionally) private _C_grow(). I think HP aCC
on PA-RISC actually uses this block to work around a compiler
bug (see http://issues.apache.org/jira/browse/STDCXX-271).

Martin

> 
> 
> Index: string
> ===================================================================
> --- string	(revision 585687)
> +++ string	(working copy)
> @@ -521,6 +521,8 @@
>  
>  #endif   // _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>  
> +private:
> +
>      size_type _C_grow (size_type, size_type) const;
>  
>  public:
> 
> 
> 
> 
> 
>> -----Original Message-----
>> From: Martin Sebor [mailto:sebor@roguewave.com] 
>> Sent: Wednesday, October 17, 2007 3:13 PM
>> To: stdcxx-dev@incubator.apache.org
>> Subject: [PATCH] std::string::_C_grow() 4.2 incompatibility 
>> (was: Re: difference in exported symbols between 4.1.3 and 
>> 4.2.0 15d dll's (MSVC 7.1))
>>
>> Martin Sebor wrote:
>>> Some more wisdom that I had snipped previously:
>>>
>>> Travis Vitek wrote:
>>> [...]
>>>  >
>>>  > Note that the basic_string<>::_C_grow() method is not 
>> accessed by any
>>>  > inline member functions, but it still causes problems. I 
>> don't think we
>>>  > can skip fixing these problems just because a function 
>> appears to not be
>>>  > accessable to user code.
>>>  >
>>>
>>> Ah, I know why! Because it's called from a member template which
>>> gets instantiated in the test.
>>>
>>> So we need to add string::_C_grow() to the list of symbols to
>>> fix in 4.2.0.
>> Travis, can you try this patch?
>>
>> Index: include/string
>> ===================================================================
>> --- include/string      (revision 585584)
>> +++ include/string      (working copy)
>> @@ -504,8 +504,6 @@
>>          return _C_make_iter (_C_data + __pos1);
>>      }
>>
>> -public:
>> -
>>  #ifndef _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>>
>>      template <class _InputIter>
>> @@ -519,6 +517,8 @@
>>          return __rw_replace_aux (*this, __first1, __last1, __first2, 
>> __last2);
>>      }
>>
>> +public:
>> +
>>  #endif   // _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>>
>>      size_type _C_grow (size_type, size_type) const;
>>
>>


RE: [PATCH] std::string::_C_grow() 4.2 incompatibility (was: Re: difference in exported symbols between 4.1.3 and 4.2.0 15d dll's (MSVC 7.1))

Posted by Travis Vitek <tv...@roguewave.com>.
Martin,

That patch won't work. The _C_grow needs to be made private. It was
private in 4.1.3, but is public in 4.2. IMO it should always be private
and it was an oversight that under some conditions it could be made
public.

I have tested the following patch.


Index: string
===================================================================
--- string	(revision 585687)
+++ string	(working copy)
@@ -521,6 +521,8 @@
 
 #endif   // _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
 
+private:
+
     size_type _C_grow (size_type, size_type) const;
 
 public:





>-----Original Message-----
>From: Martin Sebor [mailto:sebor@roguewave.com] 
>Sent: Wednesday, October 17, 2007 3:13 PM
>To: stdcxx-dev@incubator.apache.org
>Subject: [PATCH] std::string::_C_grow() 4.2 incompatibility 
>(was: Re: difference in exported symbols between 4.1.3 and 
>4.2.0 15d dll's (MSVC 7.1))
>
>Martin Sebor wrote:
>> Some more wisdom that I had snipped previously:
>> 
>> Travis Vitek wrote:
>> [...]
>>  >
>>  > Note that the basic_string<>::_C_grow() method is not 
>accessed by any
>>  > inline member functions, but it still causes problems. I 
>don't think we
>>  > can skip fixing these problems just because a function 
>appears to not be
>>  > accessable to user code.
>>  >
>> 
>> Ah, I know why! Because it's called from a member template which
>> gets instantiated in the test.
>> 
>> So we need to add string::_C_grow() to the list of symbols to
>> fix in 4.2.0.
>
>Travis, can you try this patch?
>
>Index: include/string
>===================================================================
>--- include/string      (revision 585584)
>+++ include/string      (working copy)
>@@ -504,8 +504,6 @@
>          return _C_make_iter (_C_data + __pos1);
>      }
>
>-public:
>-
>  #ifndef _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>
>      template <class _InputIter>
>@@ -519,6 +517,8 @@
>          return __rw_replace_aux (*this, __first1, __last1, __first2, 
>__last2);
>      }
>
>+public:
>+
>  #endif   // _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES
>
>      size_type _C_grow (size_type, size_type) const;
>
>

[PATCH] std::string::_C_grow() 4.2 incompatibility (was: Re: difference in exported symbols between 4.1.3 and 4.2.0 15d dll's (MSVC 7.1))

Posted by Martin Sebor <se...@roguewave.com>.
Martin Sebor wrote:
> Some more wisdom that I had snipped previously:
> 
> Travis Vitek wrote:
> [...]
>  >
>  > Note that the basic_string<>::_C_grow() method is not accessed by any
>  > inline member functions, but it still causes problems. I don't think we
>  > can skip fixing these problems just because a function appears to not be
>  > accessable to user code.
>  >
> 
> Ah, I know why! Because it's called from a member template which
> gets instantiated in the test.
> 
> So we need to add string::_C_grow() to the list of symbols to
> fix in 4.2.0.

Travis, can you try this patch?

Index: include/string
===================================================================
--- include/string      (revision 585584)
+++ include/string      (working copy)
@@ -504,8 +504,6 @@
          return _C_make_iter (_C_data + __pos1);
      }

-public:
-
  #ifndef _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES

      template <class _InputIter>
@@ -519,6 +517,8 @@
          return __rw_replace_aux (*this, __first1, __last1, __first2, 
__last2);
      }

+public:
+
  #endif   // _RWSTD_NO_STRING_OUTLINED_MEMBER_TEMPLATES

      size_type _C_grow (size_type, size_type) const;


Re: difference in exported symbols between 4.1.3 and 4.2.0 15d dll's (MSVC 7.1)

Posted by Martin Sebor <se...@roguewave.com>.
Some more wisdom that I had snipped previously:

Travis Vitek wrote:
[...]
 >
 > Note that the basic_string<>::_C_grow() method is not accessed by any
 > inline member functions, but it still causes problems. I don't think we
 > can skip fixing these problems just because a function appears to not be
 > accessable to user code.
 >

Ah, I know why! Because it's called from a member template which
gets instantiated in the test.

So we need to add string::_C_grow() to the list of symbols to
fix in 4.2.0.

Martin


Martin Sebor wrote:
>  From a private discussion (copied below) it sounds like the set
> of real ABI problems on Windows is limited to the limits constants,
> the runtime exception classes, the __rw::__rw_facet (which is an
> alias for std::locale::facet) ctor and dtor, and string::_C_grow:
> 
> Travis Vitek wrote:
>  > Failing tests and the symbol it fails to access...
>  >
>  > manual/limits.exe  : ?__rw_dbl_infinity@__rw@@3NB
>  > manual/codecvt.exe : ??0__rw_facet@__rw@@QAE@I@Z
>  > manual/ifstream.exe: ??0exception@@QAE@ABV0@@Z
>  > tutorial/exceptn.exe ??0exception@@QAE@ABV0@@Z
>  > tutorial/stocks.exe  ??1__rw_facet@__rw@@UAE@XZ
>  > tests/2.smartptr.weak.exe ??0exception@@QAE@ABV0@@Z
>  > tests/21.string.insert.exe
>  > ?_C_grow@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@AB
>  > EIII@Z
>  > tests/22.locale.money.get.exe ??0__rw_facet@__rw@@QAE@I@Z
>  > tests/22.locale.money.put.exe
>  > ?_C_grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AB
>  > EIII@Z
>  > tests/22.locale.num.put.exe  ??1__rw_facet@__rw@@UAE@XZ
>  >
>  >> -----Original Message-----
>  >> From: Martin Sebor [mailto:sebor@roguewave.com]
>  >> Sent: Wednesday, October 17, 2007 1:44 PM
>  >> To: Travis Vitek
>  >> Subject: Windows patch
>  >>
>  >> Btw., it occurs to me that only the __rw_facet access changes
>  >> (public -> private and vice versa) need to be guarded for MSVC.
>  >> The rest of them are purely stylistic since the names of the
>  >> functions are already in the private namespace (due to the _C_
>  >> prefix). I.e., we can leave them the way they were and just
>  >> create a Jira issue to make them private in 5.0. I'm hoping
>  >> this will considerably reduce the effort of backing them out
>  >> (or guarding them) for 4.2.0.
>  >>
>  >> Martin
>  >>
> 
> 
> 
> Martin Sebor wrote:
>> Farid Zaripov wrote:
>>>   Below is the difference in exported symbols between 4.1.3 and 4.2.0
>>> 15d dll's (MSVC 7.1).
>>> I've removed the symbols, which appears in 4.2.0 dll but not exist in
>>> 4.1.3 dll.
>>
>> To make the list easier to read I've replaced the long names with
>> their standard typedefs (and unsigned short with wchar_t even though
>> they're not synonymous):
>>
>> ***** stdlib15d.dll.4.1.3
>> public: __rw::__rw_facet::__rw_facet(unsigned)
>> ***** libstd15d.dll.4.2.0
>> protected: __rw::__rw_facet::__rw_facet(unsigned)
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> public: virtual __rw::__rw_facet::~__rw_facet()
>> ***** libstd15d.dll.4.2.0
>> protected: virtual __rw::__rw_facet::~__rw_facet()
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> private: unsigned std::string::_C_grow(unsigned, unsigned) const
>> private: unsigned std::wstring >::_C_grow(unsigned, unsigned) const
>> private: int std::stringbuf::_C_grow(int, int) const
>> private: int std::wstringbuf::_C_grow(int, int) const
>> ***** libstd15d.dll.4.2.0
>> public: unsigned std::string::_C_grow(unsigned, unsigned) const
>> public: unsigned std::wstring::_C_grow(unsigned, unsigned) const
>> private: int std::stringbuf_C_grow(int) const
>> private: int std::wstringbuf::_C_grow(int) const
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> protected: int std::streambuf::_C_putback_avail() const
>> protected: int std::wstreambuf::_C_putback_avail() const
>> ***** libstd15d.dll.4.2.0
>> protected: unsigned std::streambuf::_C_putback_avail() const
>> protected: unsigned std::wstreambuf::_C_putback_avail() const
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> protected: int std::streambuf::_C_write_avail() const
>> protected: int std::wstreambuf::_C_write_avail() const
>> ***** libstd15d.dll.4.2.0
>> protected: unsigned std::streambuf::_C_write_avail() const
>> protected: unsigned std::wstreambuf::_C_write_avail() const
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> public: bad_cast::bad_cast(bad_cast const &)
>> public: bad_typeid::bad_typeid(bad_typeid const &)
>> public: exception::exception( exception const &)
>> public: exception::exception()
>> public: virtual bad_cast::~bad_cast()
>> public: virtual bad_typeid::~bad_typeid()
>> public: virtual exception::~exception()
>> public: bad_cast & bad_cast::operator=(bad_cast const &)
>> public: bad_typeid & bad_typeid::operator=(bad_typeid const &)
>> public: exception & exception::operator=(exception const &)
>> const exception::`vftable'
>> protected: int std::stringbuf::_C_strlen() const
>> protected: int std::wstringbuf::_C_strlen() const
>> public: std::string& std::string::insert(unsigned, unsigned, char)
>> public: std::wstring& std::wstring::insert(unsigned, unsigned, wchar_t)
>> public: virtual char const* exception::what() const
>>
>> ***** libstd15d.dll.4.2.0
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> double const __rw::__rw_dbl_denorm_min
>> double const __rw::__rw_dbl_infinity
>> double const __rw::__rw_dbl_qNaN
>> double const __rw::__rw_dbl_sNaN
>> float const __rw::__rw_flt_denorm_min
>> float const __rw::__rw_flt_infinity
>> float const __rw::__rw_flt_qNaN
>> float const __rw::__rw_flt_sNaN
>> long double const __rw::__rw_ldbl_denorm_min
>> long double const __rw::__rw_ldbl_infinity
>> long double const __rw::__rw_ldbl_qNaN
>> long double const __rw::__rw_ldbl_sNaN
>> ***** libstd15d.dll.4.2.0
>> __rw_dbl_denorm_min
>> __rw_dbl_infinity
>> __rw_dbl_qNaN
>> __rw_dbl_sNaN
>> __rw_flt_denorm_min
>> __rw_flt_infinity
>> __rw_flt_qNaN
>> __rw_flt_sNaN
>> __rw_ldbl_denorm_min
>> __rw_ldbl_infinity
>> __rw_ldbl_qNaN
>> __rw_ldbl_sNaN
>> __rw_once
>> *****
>>
>>
>>
>>>
>>> ***** stdlib15d.dll.4.1.3
>>> public: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
>>> ***** libstd15d.dll.4.2.0
>>> protected: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
>>> *****
>>>
>>> ***** stdlib15d.dll.4.1.3
>>> public: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
>>> ***** libstd15d.dll.4.2.0
>>> protected: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
>>> *****
>>>
>>> ***** stdlib15d.dll.4.1.3
>>> private: unsigned int __thiscall std::basic_string<char,struct
>>> std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
>>> int,unsigned int)const private: unsigned int __thiscall 
>>> std::basic_string<unsigned short,struct
>>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>>> ::_C_grow(unsigned int,unsigned int)const 
>>> private: int __thiscall std::basic_stringbuf<char,struct
>>> std::char_traits<char>,class std::allocator<char>
>>>> ::_C_grow(int,int)const 
>>> private: int __thiscall std::basic_stringbuf<unsigned short,struct
>>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>>> ::_C_grow(int,int)const 
>>> ***** libstd15d.dll.4.2.0
>>> public: unsigned int __thiscall std::basic_string<char,struct
>>> std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
>>> int,unsigned int)const public: unsigned int __thiscall 
>>> std::basic_string<unsigned short,struct
>>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>>> ::_C_grow(unsigned int,unsigned int)const 
>>> private: int __thiscall std::basic_stringbuf<char,struct
>>> std::char_traits<char>,class std::allocator<char> 
>>> >::_C_grow(int)const private: int __thiscall 
>>> std::basic_stringbuf<unsigned short,struct
>>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>>> ::_C_grow(int)const 
>>> *****
>>>
>>> ***** stdlib15d.dll.4.1.3
>>> protected: int __thiscall std::basic_streambuf<char,struct
>>> std::char_traits<char> >::_C_putback_avail(void)const protected: int 
>>> __thiscall std::basic_streambuf<unsigned short,struct
>>> std::char_traits<unsigned short> >::_C_putback_avail(void)const ***** 
>>> libstd15d.dll.4.2.0
>>> protected: unsigned int __thiscall std::basic_streambuf<char,struct
>>> std::char_traits<char> >::_C_putback_avail(void)const protected: 
>>> unsigned int __thiscall std::basic_streambuf<unsigned
>>> short,struct std::char_traits<unsigned short>
>>>> ::_C_putback_avail(void)const 
>>> *****
>>>
>>> ***** stdlib15d.dll.4.1.3
>>> protected: int __thiscall std::basic_streambuf<char,struct
>>> std::char_traits<char> >::_C_write_avail(void)const protected: int 
>>> __thiscall std::basic_streambuf<unsigned short,struct
>>> std::char_traits<unsigned short> >::_C_write_avail(void)const ***** 
>>> libstd15d.dll.4.2.0
>>> protected: unsigned int __thiscall std::basic_streambuf<char,struct
>>> std::char_traits<char> >::_C_write_avail(void)const protected: 
>>> unsigned int __thiscall std::basic_streambuf<unsigned
>>> short,struct std::char_traits<unsigned short>
>>>> ::_C_write_avail(void)const 
>>> *****
>>>
>>> ***** stdlib15d.dll.4.1.3
>>> public: __thiscall bad_cast::bad_cast(class bad_cast const &)
>>> public: __thiscall bad_typeid::bad_typeid(class bad_typeid const &)
>>> public: __thiscall exception::exception(class exception const &)
>>> public: __thiscall exception::exception(void)
>>> public: virtual __thiscall bad_cast::~bad_cast(void)
>>> public: virtual __thiscall bad_typeid::~bad_typeid(void)
>>> public: virtual __thiscall exception::~exception(void)
>>> public: class bad_cast & __thiscall bad_cast::operator=(class bad_cast
>>> const &)
>>> public: class bad_typeid & __thiscall bad_typeid::operator=(class
>>> bad_typeid const &)
>>> public: class exception & __thiscall exception::operator=(class
>>> exception const &)
>>> const exception::`vftable'
>>> protected: int __thiscall std::basic_stringbuf<char,struct
>>> std::char_traits<char>,class std::allocator<char>
>>>> ::_C_strlen(void)const 
>>> protected: int __thiscall std::basic_stringbuf<unsigned short,struct
>>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>>> ::_C_strlen(void)const 
>>> public: class std::basic_string<char,struct std::char_traits<char>,class
>>> std::allocator<char> > & __thiscall std::basic_string<char,struct
>>> std::char_traits<char>,class std::allocator<char> >::insert(unsigned
>>> int,unsigned int,char)
>>> public: class std::basic_string<unsigned short,struct
>>> std::char_traits<unsigned short>,class std::allocator<unsigned short> >
>>> & __thiscall std::basic_string<unsigned short,struct
>>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>>> ::insert(unsigned int,unsigned int,unsigned short)
>>> public: virtual char const * __thiscall exception::what(void)const 
>>> ***** libstd15d.dll.4.2.0
>>> *****
>>>
>>> ***** stdlib15d.dll.4.1.3
>>> double const __rw::__rw_dbl_denorm_min
>>> double const __rw::__rw_dbl_infinity
>>> double const __rw::__rw_dbl_qNaN
>>> double const __rw::__rw_dbl_sNaN
>>> float const __rw::__rw_flt_denorm_min
>>> float const __rw::__rw_flt_infinity
>>> float const __rw::__rw_flt_qNaN
>>> float const __rw::__rw_flt_sNaN
>>> long double const __rw::__rw_ldbl_denorm_min
>>> long double const __rw::__rw_ldbl_infinity
>>> long double const __rw::__rw_ldbl_qNaN
>>> long double const __rw::__rw_ldbl_sNaN
>>> ***** libstd15d.dll.4.2.0
>>> __rw_dbl_denorm_min
>>> __rw_dbl_infinity
>>> __rw_dbl_qNaN
>>> __rw_dbl_sNaN
>>> __rw_flt_denorm_min
>>> __rw_flt_infinity
>>> __rw_flt_qNaN
>>> __rw_flt_sNaN
>>> __rw_ldbl_denorm_min
>>> __rw_ldbl_infinity
>>> __rw_ldbl_qNaN
>>> __rw_ldbl_sNaN
>>> __rw_once
>>> *****
>>>
>>> Farid.
>>
> 


Re: difference in exported symbols between 4.1.3 and 4.2.0 15d dll's (MSVC 7.1)

Posted by Martin Sebor <se...@roguewave.com>.
 From a private discussion (copied below) it sounds like the set
of real ABI problems on Windows is limited to the limits constants,
the runtime exception classes, the __rw::__rw_facet (which is an
alias for std::locale::facet) ctor and dtor, and string::_C_grow:

Travis Vitek wrote:
 > Failing tests and the symbol it fails to access...
 >
 > manual/limits.exe  : ?__rw_dbl_infinity@__rw@@3NB
 > manual/codecvt.exe : ??0__rw_facet@__rw@@QAE@I@Z
 > manual/ifstream.exe: ??0exception@@QAE@ABV0@@Z
 > tutorial/exceptn.exe ??0exception@@QAE@ABV0@@Z
 > tutorial/stocks.exe  ??1__rw_facet@__rw@@UAE@XZ
 > tests/2.smartptr.weak.exe ??0exception@@QAE@ABV0@@Z
 > tests/21.string.insert.exe
 > ?_C_grow@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@AB
 > EIII@Z
 > tests/22.locale.money.get.exe ??0__rw_facet@__rw@@QAE@I@Z
 > tests/22.locale.money.put.exe
 > ?_C_grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AB
 > EIII@Z
 > tests/22.locale.num.put.exe  ??1__rw_facet@__rw@@UAE@XZ
 >
 >> -----Original Message-----
 >> From: Martin Sebor [mailto:sebor@roguewave.com]
 >> Sent: Wednesday, October 17, 2007 1:44 PM
 >> To: Travis Vitek
 >> Subject: Windows patch
 >>
 >> Btw., it occurs to me that only the __rw_facet access changes
 >> (public -> private and vice versa) need to be guarded for MSVC.
 >> The rest of them are purely stylistic since the names of the
 >> functions are already in the private namespace (due to the _C_
 >> prefix). I.e., we can leave them the way they were and just
 >> create a Jira issue to make them private in 5.0. I'm hoping
 >> this will considerably reduce the effort of backing them out
 >> (or guarding them) for 4.2.0.
 >>
 >> Martin
 >>



Martin Sebor wrote:
> Farid Zaripov wrote:
>>   Below is the difference in exported symbols between 4.1.3 and 4.2.0
>> 15d dll's (MSVC 7.1).
>> I've removed the symbols, which appears in 4.2.0 dll but not exist in
>> 4.1.3 dll.
> 
> To make the list easier to read I've replaced the long names with
> their standard typedefs (and unsigned short with wchar_t even though
> they're not synonymous):
> 
> ***** stdlib15d.dll.4.1.3
> public: __rw::__rw_facet::__rw_facet(unsigned)
> ***** libstd15d.dll.4.2.0
> protected: __rw::__rw_facet::__rw_facet(unsigned)
> *****
> 
> ***** stdlib15d.dll.4.1.3
> public: virtual __rw::__rw_facet::~__rw_facet()
> ***** libstd15d.dll.4.2.0
> protected: virtual __rw::__rw_facet::~__rw_facet()
> *****
> 
> ***** stdlib15d.dll.4.1.3
> private: unsigned std::string::_C_grow(unsigned, unsigned) const
> private: unsigned std::wstring >::_C_grow(unsigned, unsigned) const
> private: int std::stringbuf::_C_grow(int, int) const
> private: int std::wstringbuf::_C_grow(int, int) const
> ***** libstd15d.dll.4.2.0
> public: unsigned std::string::_C_grow(unsigned, unsigned) const
> public: unsigned std::wstring::_C_grow(unsigned, unsigned) const
> private: int std::stringbuf_C_grow(int) const
> private: int std::wstringbuf::_C_grow(int) const
> *****
> 
> ***** stdlib15d.dll.4.1.3
> protected: int std::streambuf::_C_putback_avail() const
> protected: int std::wstreambuf::_C_putback_avail() const
> ***** libstd15d.dll.4.2.0
> protected: unsigned std::streambuf::_C_putback_avail() const
> protected: unsigned std::wstreambuf::_C_putback_avail() const
> *****
> 
> ***** stdlib15d.dll.4.1.3
> protected: int std::streambuf::_C_write_avail() const
> protected: int std::wstreambuf::_C_write_avail() const
> ***** libstd15d.dll.4.2.0
> protected: unsigned std::streambuf::_C_write_avail() const
> protected: unsigned std::wstreambuf::_C_write_avail() const
> *****
> 
> ***** stdlib15d.dll.4.1.3
> public: bad_cast::bad_cast(bad_cast const &)
> public: bad_typeid::bad_typeid(bad_typeid const &)
> public: exception::exception( exception const &)
> public: exception::exception()
> public: virtual bad_cast::~bad_cast()
> public: virtual bad_typeid::~bad_typeid()
> public: virtual exception::~exception()
> public: bad_cast & bad_cast::operator=(bad_cast const &)
> public: bad_typeid & bad_typeid::operator=(bad_typeid const &)
> public: exception & exception::operator=(exception const &)
> const exception::`vftable'
> protected: int std::stringbuf::_C_strlen() const
> protected: int std::wstringbuf::_C_strlen() const
> public: std::string& std::string::insert(unsigned, unsigned, char)
> public: std::wstring& std::wstring::insert(unsigned, unsigned, wchar_t)
> public: virtual char const* exception::what() const
> 
> ***** libstd15d.dll.4.2.0
> *****
> 
> ***** stdlib15d.dll.4.1.3
> double const __rw::__rw_dbl_denorm_min
> double const __rw::__rw_dbl_infinity
> double const __rw::__rw_dbl_qNaN
> double const __rw::__rw_dbl_sNaN
> float const __rw::__rw_flt_denorm_min
> float const __rw::__rw_flt_infinity
> float const __rw::__rw_flt_qNaN
> float const __rw::__rw_flt_sNaN
> long double const __rw::__rw_ldbl_denorm_min
> long double const __rw::__rw_ldbl_infinity
> long double const __rw::__rw_ldbl_qNaN
> long double const __rw::__rw_ldbl_sNaN
> ***** libstd15d.dll.4.2.0
> __rw_dbl_denorm_min
> __rw_dbl_infinity
> __rw_dbl_qNaN
> __rw_dbl_sNaN
> __rw_flt_denorm_min
> __rw_flt_infinity
> __rw_flt_qNaN
> __rw_flt_sNaN
> __rw_ldbl_denorm_min
> __rw_ldbl_infinity
> __rw_ldbl_qNaN
> __rw_ldbl_sNaN
> __rw_once
> *****
> 
> 
> 
>>
>> ***** stdlib15d.dll.4.1.3
>> public: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
>> ***** libstd15d.dll.4.2.0
>> protected: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> public: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
>> ***** libstd15d.dll.4.2.0
>> protected: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> private: unsigned int __thiscall std::basic_string<char,struct
>> std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
>> int,unsigned int)const private: unsigned int __thiscall 
>> std::basic_string<unsigned short,struct
>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>> ::_C_grow(unsigned int,unsigned int)const 
>> private: int __thiscall std::basic_stringbuf<char,struct
>> std::char_traits<char>,class std::allocator<char>
>>> ::_C_grow(int,int)const 
>> private: int __thiscall std::basic_stringbuf<unsigned short,struct
>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>> ::_C_grow(int,int)const 
>> ***** libstd15d.dll.4.2.0
>> public: unsigned int __thiscall std::basic_string<char,struct
>> std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
>> int,unsigned int)const public: unsigned int __thiscall 
>> std::basic_string<unsigned short,struct
>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>> ::_C_grow(unsigned int,unsigned int)const 
>> private: int __thiscall std::basic_stringbuf<char,struct
>> std::char_traits<char>,class std::allocator<char> >::_C_grow(int)const 
>> private: int __thiscall std::basic_stringbuf<unsigned short,struct
>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>> ::_C_grow(int)const 
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> protected: int __thiscall std::basic_streambuf<char,struct
>> std::char_traits<char> >::_C_putback_avail(void)const protected: int 
>> __thiscall std::basic_streambuf<unsigned short,struct
>> std::char_traits<unsigned short> >::_C_putback_avail(void)const ***** 
>> libstd15d.dll.4.2.0
>> protected: unsigned int __thiscall std::basic_streambuf<char,struct
>> std::char_traits<char> >::_C_putback_avail(void)const protected: 
>> unsigned int __thiscall std::basic_streambuf<unsigned
>> short,struct std::char_traits<unsigned short>
>>> ::_C_putback_avail(void)const 
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> protected: int __thiscall std::basic_streambuf<char,struct
>> std::char_traits<char> >::_C_write_avail(void)const protected: int 
>> __thiscall std::basic_streambuf<unsigned short,struct
>> std::char_traits<unsigned short> >::_C_write_avail(void)const ***** 
>> libstd15d.dll.4.2.0
>> protected: unsigned int __thiscall std::basic_streambuf<char,struct
>> std::char_traits<char> >::_C_write_avail(void)const protected: 
>> unsigned int __thiscall std::basic_streambuf<unsigned
>> short,struct std::char_traits<unsigned short>
>>> ::_C_write_avail(void)const 
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> public: __thiscall bad_cast::bad_cast(class bad_cast const &)
>> public: __thiscall bad_typeid::bad_typeid(class bad_typeid const &)
>> public: __thiscall exception::exception(class exception const &)
>> public: __thiscall exception::exception(void)
>> public: virtual __thiscall bad_cast::~bad_cast(void)
>> public: virtual __thiscall bad_typeid::~bad_typeid(void)
>> public: virtual __thiscall exception::~exception(void)
>> public: class bad_cast & __thiscall bad_cast::operator=(class bad_cast
>> const &)
>> public: class bad_typeid & __thiscall bad_typeid::operator=(class
>> bad_typeid const &)
>> public: class exception & __thiscall exception::operator=(class
>> exception const &)
>> const exception::`vftable'
>> protected: int __thiscall std::basic_stringbuf<char,struct
>> std::char_traits<char>,class std::allocator<char>
>>> ::_C_strlen(void)const 
>> protected: int __thiscall std::basic_stringbuf<unsigned short,struct
>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>> ::_C_strlen(void)const 
>> public: class std::basic_string<char,struct std::char_traits<char>,class
>> std::allocator<char> > & __thiscall std::basic_string<char,struct
>> std::char_traits<char>,class std::allocator<char> >::insert(unsigned
>> int,unsigned int,char)
>> public: class std::basic_string<unsigned short,struct
>> std::char_traits<unsigned short>,class std::allocator<unsigned short> >
>> & __thiscall std::basic_string<unsigned short,struct
>> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>>> ::insert(unsigned int,unsigned int,unsigned short)
>> public: virtual char const * __thiscall exception::what(void)const 
>> ***** libstd15d.dll.4.2.0
>> *****
>>
>> ***** stdlib15d.dll.4.1.3
>> double const __rw::__rw_dbl_denorm_min
>> double const __rw::__rw_dbl_infinity
>> double const __rw::__rw_dbl_qNaN
>> double const __rw::__rw_dbl_sNaN
>> float const __rw::__rw_flt_denorm_min
>> float const __rw::__rw_flt_infinity
>> float const __rw::__rw_flt_qNaN
>> float const __rw::__rw_flt_sNaN
>> long double const __rw::__rw_ldbl_denorm_min
>> long double const __rw::__rw_ldbl_infinity
>> long double const __rw::__rw_ldbl_qNaN
>> long double const __rw::__rw_ldbl_sNaN
>> ***** libstd15d.dll.4.2.0
>> __rw_dbl_denorm_min
>> __rw_dbl_infinity
>> __rw_dbl_qNaN
>> __rw_dbl_sNaN
>> __rw_flt_denorm_min
>> __rw_flt_infinity
>> __rw_flt_qNaN
>> __rw_flt_sNaN
>> __rw_ldbl_denorm_min
>> __rw_ldbl_infinity
>> __rw_ldbl_qNaN
>> __rw_ldbl_sNaN
>> __rw_once
>> *****
>>
>> Farid.
> 


Re: difference in exported symbols between 4.1.3 and 4.2.0 15d dll's (MSVC 7.1)

Posted by Martin Sebor <se...@roguewave.com>.
Farid Zaripov wrote:
>   Below is the difference in exported symbols between 4.1.3 and 4.2.0
> 15d dll's (MSVC 7.1).
> I've removed the symbols, which appears in 4.2.0 dll but not exist in
> 4.1.3 dll.

To make the list easier to read I've replaced the long names with
their standard typedefs (and unsigned short with wchar_t even though
they're not synonymous):

***** stdlib15d.dll.4.1.3
public: __rw::__rw_facet::__rw_facet(unsigned)
***** libstd15d.dll.4.2.0
protected: __rw::__rw_facet::__rw_facet(unsigned)
*****

***** stdlib15d.dll.4.1.3
public: virtual __rw::__rw_facet::~__rw_facet()
***** libstd15d.dll.4.2.0
protected: virtual __rw::__rw_facet::~__rw_facet()
*****

***** stdlib15d.dll.4.1.3
private: unsigned std::string::_C_grow(unsigned, unsigned) const
private: unsigned std::wstring >::_C_grow(unsigned, unsigned) const
private: int std::stringbuf::_C_grow(int, int) const
private: int std::wstringbuf::_C_grow(int, int) const
***** libstd15d.dll.4.2.0
public: unsigned std::string::_C_grow(unsigned, unsigned) const
public: unsigned std::wstring::_C_grow(unsigned, unsigned) const
private: int std::stringbuf_C_grow(int) const
private: int std::wstringbuf::_C_grow(int) const
*****

***** stdlib15d.dll.4.1.3
protected: int std::streambuf::_C_putback_avail() const
protected: int std::wstreambuf::_C_putback_avail() const
***** libstd15d.dll.4.2.0
protected: unsigned std::streambuf::_C_putback_avail() const
protected: unsigned std::wstreambuf::_C_putback_avail() const
*****

***** stdlib15d.dll.4.1.3
protected: int std::streambuf::_C_write_avail() const
protected: int std::wstreambuf::_C_write_avail() const
***** libstd15d.dll.4.2.0
protected: unsigned std::streambuf::_C_write_avail() const
protected: unsigned std::wstreambuf::_C_write_avail() const
*****

***** stdlib15d.dll.4.1.3
public: bad_cast::bad_cast(bad_cast const &)
public: bad_typeid::bad_typeid(bad_typeid const &)
public: exception::exception( exception const &)
public: exception::exception()
public: virtual bad_cast::~bad_cast()
public: virtual bad_typeid::~bad_typeid()
public: virtual exception::~exception()
public: bad_cast & bad_cast::operator=(bad_cast const &)
public: bad_typeid & bad_typeid::operator=(bad_typeid const &)
public: exception & exception::operator=(exception const &)
const exception::`vftable'
protected: int std::stringbuf::_C_strlen() const
protected: int std::wstringbuf::_C_strlen() const
public: std::string& std::string::insert(unsigned, unsigned, char)
public: std::wstring& std::wstring::insert(unsigned, unsigned, wchar_t)
public: virtual char const* exception::what() const

***** libstd15d.dll.4.2.0
*****

***** stdlib15d.dll.4.1.3
double const __rw::__rw_dbl_denorm_min
double const __rw::__rw_dbl_infinity
double const __rw::__rw_dbl_qNaN
double const __rw::__rw_dbl_sNaN
float const __rw::__rw_flt_denorm_min
float const __rw::__rw_flt_infinity
float const __rw::__rw_flt_qNaN
float const __rw::__rw_flt_sNaN
long double const __rw::__rw_ldbl_denorm_min
long double const __rw::__rw_ldbl_infinity
long double const __rw::__rw_ldbl_qNaN
long double const __rw::__rw_ldbl_sNaN
***** libstd15d.dll.4.2.0
__rw_dbl_denorm_min
__rw_dbl_infinity
__rw_dbl_qNaN
__rw_dbl_sNaN
__rw_flt_denorm_min
__rw_flt_infinity
__rw_flt_qNaN
__rw_flt_sNaN
__rw_ldbl_denorm_min
__rw_ldbl_infinity
__rw_ldbl_qNaN
__rw_ldbl_sNaN
__rw_once
*****



> 
> ***** stdlib15d.dll.4.1.3
> public: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
> ***** libstd15d.dll.4.2.0
> protected: __thiscall __rw::__rw_facet::__rw_facet(unsigned int)
> *****
> 
> ***** stdlib15d.dll.4.1.3
> public: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
> ***** libstd15d.dll.4.2.0
> protected: virtual __thiscall __rw::__rw_facet::~__rw_facet(void)
> *****
> 
> ***** stdlib15d.dll.4.1.3
> private: unsigned int __thiscall std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
> int,unsigned int)const 
> private: unsigned int __thiscall std::basic_string<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_grow(unsigned int,unsigned int)const 
> private: int __thiscall std::basic_stringbuf<char,struct
> std::char_traits<char>,class std::allocator<char>
>> ::_C_grow(int,int)const 
> private: int __thiscall std::basic_stringbuf<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_grow(int,int)const 
> ***** libstd15d.dll.4.2.0
> public: unsigned int __thiscall std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::_C_grow(unsigned
> int,unsigned int)const 
> public: unsigned int __thiscall std::basic_string<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_grow(unsigned int,unsigned int)const 
> private: int __thiscall std::basic_stringbuf<char,struct
> std::char_traits<char>,class std::allocator<char> >::_C_grow(int)const 
> private: int __thiscall std::basic_stringbuf<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_grow(int)const 
> *****
> 
> ***** stdlib15d.dll.4.1.3
> protected: int __thiscall std::basic_streambuf<char,struct
> std::char_traits<char> >::_C_putback_avail(void)const 
> protected: int __thiscall std::basic_streambuf<unsigned short,struct
> std::char_traits<unsigned short> >::_C_putback_avail(void)const 
> ***** libstd15d.dll.4.2.0
> protected: unsigned int __thiscall std::basic_streambuf<char,struct
> std::char_traits<char> >::_C_putback_avail(void)const 
> protected: unsigned int __thiscall std::basic_streambuf<unsigned
> short,struct std::char_traits<unsigned short>
>> ::_C_putback_avail(void)const 
> *****
> 
> ***** stdlib15d.dll.4.1.3
> protected: int __thiscall std::basic_streambuf<char,struct
> std::char_traits<char> >::_C_write_avail(void)const 
> protected: int __thiscall std::basic_streambuf<unsigned short,struct
> std::char_traits<unsigned short> >::_C_write_avail(void)const 
> ***** libstd15d.dll.4.2.0
> protected: unsigned int __thiscall std::basic_streambuf<char,struct
> std::char_traits<char> >::_C_write_avail(void)const 
> protected: unsigned int __thiscall std::basic_streambuf<unsigned
> short,struct std::char_traits<unsigned short>
>> ::_C_write_avail(void)const 
> *****
> 
> ***** stdlib15d.dll.4.1.3
> public: __thiscall bad_cast::bad_cast(class bad_cast const &)
> public: __thiscall bad_typeid::bad_typeid(class bad_typeid const &)
> public: __thiscall exception::exception(class exception const &)
> public: __thiscall exception::exception(void)
> public: virtual __thiscall bad_cast::~bad_cast(void)
> public: virtual __thiscall bad_typeid::~bad_typeid(void)
> public: virtual __thiscall exception::~exception(void)
> public: class bad_cast & __thiscall bad_cast::operator=(class bad_cast
> const &)
> public: class bad_typeid & __thiscall bad_typeid::operator=(class
> bad_typeid const &)
> public: class exception & __thiscall exception::operator=(class
> exception const &)
> const exception::`vftable'
> protected: int __thiscall std::basic_stringbuf<char,struct
> std::char_traits<char>,class std::allocator<char>
>> ::_C_strlen(void)const 
> protected: int __thiscall std::basic_stringbuf<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::_C_strlen(void)const 
> public: class std::basic_string<char,struct std::char_traits<char>,class
> std::allocator<char> > & __thiscall std::basic_string<char,struct
> std::char_traits<char>,class std::allocator<char> >::insert(unsigned
> int,unsigned int,char)
> public: class std::basic_string<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short> >
> & __thiscall std::basic_string<unsigned short,struct
> std::char_traits<unsigned short>,class std::allocator<unsigned short>
>> ::insert(unsigned int,unsigned int,unsigned short)
> public: virtual char const * __thiscall exception::what(void)const 
> ***** libstd15d.dll.4.2.0
> *****
> 
> ***** stdlib15d.dll.4.1.3
> double const __rw::__rw_dbl_denorm_min
> double const __rw::__rw_dbl_infinity
> double const __rw::__rw_dbl_qNaN
> double const __rw::__rw_dbl_sNaN
> float const __rw::__rw_flt_denorm_min
> float const __rw::__rw_flt_infinity
> float const __rw::__rw_flt_qNaN
> float const __rw::__rw_flt_sNaN
> long double const __rw::__rw_ldbl_denorm_min
> long double const __rw::__rw_ldbl_infinity
> long double const __rw::__rw_ldbl_qNaN
> long double const __rw::__rw_ldbl_sNaN
> ***** libstd15d.dll.4.2.0
> __rw_dbl_denorm_min
> __rw_dbl_infinity
> __rw_dbl_qNaN
> __rw_dbl_sNaN
> __rw_flt_denorm_min
> __rw_flt_infinity
> __rw_flt_qNaN
> __rw_flt_sNaN
> __rw_ldbl_denorm_min
> __rw_ldbl_infinity
> __rw_ldbl_qNaN
> __rw_ldbl_sNaN
> __rw_once
> *****
> 
> Farid.