VS 8 + SP1 + STLPort 5.1::ctype<char>
От: smithx  
Дата: 19.06.07 19:56
Оценка:
Здравствуйте, тут такая проблема: использую boost::format следущим видом:

...
std::string str = boost::str (boost::format ("%04d") % 1);
...


так вот этот вот 'boost::format ("%04d")' вылетает по AV.

тестовый примерчик:
#include <iostream>
#include <string>
#include "boost/format.hpp"

int main () {
  std::string str = boost::str (boost::format ("%04d") % 1);
  std::cout << str << std::endl;
  return 0;
};

работает как часы.

потрассировал исходный вариант, валится внутри STLPort::ctype::is
bool is(mask __m, char __c) const
  { return ((*(_M_ctype_table+(unsigned char)__c)) & __m) != 0; }


отличия в сгенерированом из ctype::is коде следущие:
исходный вариант:
  bool is(mask __m, char __c) const
  { return ((*(_M_ctype_table+(unsigned char)__c)) & __m) != 0; }
004A0000  push        ebp  
004A0001  mov         ebp,esp 
004A0003  push        ecx  
004A0004  mov         dword ptr [ebp-4],0CCCCCCCCh 
004A000B  mov         dword ptr [ebp-4],ecx 
004A000E  movzx       eax,byte ptr [__c] 
004A0012  mov         ecx,dword ptr [this] 
004A0015  mov         edx,dword ptr [ecx+0Ch] 
004A0018  mov         eax,dword ptr [edx+eax*4] // <-- AV
004A001B  and         eax,dword ptr [__m] 
004A001E  neg         eax  
004A0020  sbb         eax,eax 
004A0022  neg         eax  
004A0024  mov         esp,ebp 
004A0026  pop         ebp  
004A0027  ret         8


тестовый примерчик:
  bool is(mask __m, char __c) const
  { return ((*(_M_ctype_table+(unsigned char)__c)) & __m) != 0; }
10002180  push        ebp  
10002181  mov         ebp,esp 
10002183  push        ecx  
10002184  mov         dword ptr [ebp-4],ecx 
10002187  movzx       eax,byte ptr [__c] 
1000218B  mov         ecx,dword ptr [this] 
1000218E  mov         edx,dword ptr [ecx+8] 
10002191  mov         eax,dword ptr [edx+eax*4] 
10002194  and         eax,dword ptr [__m] 
10002197  neg         eax  
10002199  sbb         eax,eax 
1000219B  neg         eax  
1000219D  mov         esp,ebp 
1000219F  pop         ebp  
100021A0  ret         8


подскажите, плз, куда копать
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.