Показаны сообщения с ярлыком vs2010. Показать все сообщения
Показаны сообщения с ярлыком vs2010. Показать все сообщения

понедельник, 2 февраля 2015 г.

bug in vs2010 inlined function

All know how to calculate the crc32, yeah ?
Let`s see output from visual studio 2010 for inlined version of crc32:

Here list is alias for ecx register:

  mov     [ebp+params.list_rva], list  
  not     cl 
  movzx   list, cl ; ok, now in ECX 00 00 00 cl
  mov     eax, ds:CRCTable[list*4]
  xor     eax, 0FFFFFFh 
  movzx   ebx, al
  movzx   list, ch ; wait, CH now zero bcs of previous movzx ecx, cl !
  shr     eax, 8
  xor     list, ebx
  xor     eax, ds:CRCTable[list*4]
  movzx   list, byte ptr [ebp+params.list_rva+2]
  movzx   ebx, al
  shr     eax, 8
  xor     list, ebx
  xor     eax, ds:CRCTable[list*4]
  movzx   list, byte ptr [ebp+params.list_rva+3]
  movzx   ebx, al
it is obvious that the result of this functions is incorrect

понедельник, 19 марта 2012 г.

ids files for recent MFC versions

I uploaded archive of IDS files for both 32 & 64bit MFC dll modules:
  • mfc9 (from vs2008)
  • mfc10 (from vs2010)
  • mfc11 (from vs2011)
This archive also contains IDT files used for building

воскресенье, 27 ноября 2011 г.

vs2010 vs w2k

а вот например одна и та же прога собирается на vs2008 & vs2010 (так бывает, бгг)
Собранная на vs2008 вполне себе работает под w2k (пионэры поди и не знаю уже что это такое, бгг)
Собранная же на vs2010 не работает - при запуске гордо сообщает "этот файл не является приложением win32"
Это все отчего например ? Никакими опциями линковщика сие нельзя поправить ?

пятница, 28 октября 2011 г.

concurrent_queue::clear bug

все неделю проебвозился с одной крайне муторной багой
Есть например некий объект, использующий concurrent_queue из номоводного Concurrency от vs2010. В деструкторе зовется как положено метод clear. И падает иногда. Очень хитро падает, тварь - только на smp машинах с xp. Под другими (проверялось на w7 & ws2008r2) не падает
Оказалось что subj глючен:

char _Buf[sizeof(_Ty)]; // <-- тут создаем неинициализированный буфер
if (!_Internal_pop_if_present(reinterpret_cast<_Ty*>(_Buf)))


virtual void _Assign_and_destroy_item( void* _Dst, _Page& _Src, size_t _Index )
{
_Ty& _From = _Get_ref(_Src,_Index);
_Destroyer _D(_From);
*static_cast<_Ty*>(_Dst) = _From; // а тут присваиваем неинициализированному объекту по адресу
_Buf. Соотв-но оператор = тошнит
}

лучше всего использовать простой но рабочий код вроде
while(queue.try_pop(dst)){}

Ненависть, ненависть, ненависть