Bad code generation of the std::moneypunct ctor (and possibly of the 
std::messages ctor)
----------------------------------------------------------------------------------------

                 Key: STDCXX-554
                 URL: https://issues.apache.org/jira/browse/STDCXX-554
             Project: C++ Standard Library
          Issue Type: Bug
          Components: 22. Localization
    Affects Versions: trunk
         Environment: MSVC 7.1
            Reporter: Farid Zaripov
         Attachments: stdcxx-554.patch

  The 22.locale.money.put.cpp test fails on MSVC 7.1 (15s build type) with 
buffer overrun error due to bad code generation.

  Here the assembly code for moneypunct ctor:
-------------
    _EXPLICIT moneypunct (_RWSTD_SIZE_T __refs = 0)
        : _RW::__rw_facet (__refs), money_base () { }
004018C0  push        ebp  
004018C1  mov         ebp,esp 
004018C3  push        ecx  
004018C4  mov         dword ptr [ebp-4],ecx 
004018C7  mov         eax,dword ptr [__refs] 
004018CA  push        eax  
004018CB  mov         ecx,dword ptr [this] 
004018CE  call        __rw::__rw_facet::__rw_facet (412E20h) 

004018D3  xor         ecx,ecx 
004018D5  mov         edx,dword ptr [this] 
004018D8  add         edx,38h                       // the sizeof (moneypunct) 
== 0x38
004018DB  mov         byte ptr [edx],cl           // here the place of the 
buffer overrun

004018DD  mov         eax,dword ptr [this] 
004018E0  mov         dword ptr [eax],offset std::moneypunct<char,0>::`vftable' 
(488838h) 
004018E6  mov         eax,dword ptr [this] 
004018E9  mov         esp,ebp 
004018EB  pop         ebp  
004018EC  ret         4    
-------------

  When I commented the money_base () call the test succeeded and assembly code 
has changed to:
-------------
    _EXPLICIT moneypunct (_RWSTD_SIZE_T __refs = 0)
        : _RW::__rw_facet (__refs)/*, money_base ()*/ { }
004018C0  push        ebp  
004018C1  mov         ebp,esp 
004018C3  push        ecx  
004018C4  mov         dword ptr [ebp-4],ecx 
004018C7  mov         eax,dword ptr [__refs] 
004018CA  push        eax  
004018CB  mov         ecx,dword ptr [this] 
004018CE  call        __rw::__rw_facet::__rw_facet (412E20h) 
004018D3  mov         ecx,dword ptr [this] 
004018D6  mov         dword ptr [ecx],offset std::moneypunct<char,0>::`vftable' 
(488838h) 
004018DC  mov         eax,dword ptr [this] 
004018DF  mov         esp,ebp 
004018E1  pop         ebp  
004018E2  ret         4    
-------------

  Here the same assembly, but in 12s configuration:

before change:
-------------
    const PunctT pun;
004018B1  push        1    
004018B3  lea         ecx,[esp+0B4h] 
004018BA  call        __rw::__rw_facet::__rw_facet (40A770h) 

004018BF  mov         byte ptr [esp+0E8h],bl            // 0xE8 - 0xB4 == 0x34, 
so here not buffer overrun,
                                                                            // 
but maybe changed last 4-byte member of the __rw_facet
                                                                            // 
(I suppose is _C_pid)

004018C6  mov         dword ptr [esp+0B0h],offset Punct<char,0>::`vftable' 
(43A258h) 
-------------

after change:
-------------
    const PunctT pun;
00401891  push        1    
00401893  lea         ecx,[esp+0B4h] 
0040189A  call        __rw::__rw_facet::__rw_facet (40A720h) 
0040189F  mov         dword ptr [esp+0B0h],offset Punct<char,0>::`vftable' 
(43A258h) 
-------------

  I have not verified, but I suppose that the same problem might be with 
messages class.


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to