LogoHome   >>   Opinion   >>   Happy Debugging!

Happy Debugging!

Не устаю поражаться изобретательности ребят из M$ по части глюков.
К чему-то уже приспособился, но во всяком новом коде всплывают свежие.



Элементарная проверка на выходе из функции, которая НИЧЕГО не должна
менять, только предупредить, если pEntry не назначен Parent:

>    switch (AddType)
>    {
>       case DL_LIST_ADD_TO_FRONT_IF_NEW:
>       case DL_LIST_ADD_TO_FRONT_ALWAYS:
>       {
>          LinkAddBefore(PrevEntry,pEntry);
>          break;
>       }

...

>    ASSERT(pEntry->Parent);
>    return TRUE;





И что мы видим в коде (локальное время 04:39) - сколько еще лет жизни
украла у меня эта отладка?

> 695:     switch (AddType)
> 696:     {
> 00401D80   mov         eax,dword ptr [ebp+0Ch]
> 00401D83   mov         dword ptr [ebp-10h],eax
> 00401D86   mov         ecx,dword ptr [ebp-10h]
> 00401D89   sub         ecx,0Ah
> 00401D8C   mov         dword ptr [ebp-10h],ecx
> 00401D8F   cmp         dword ptr [ebp-10h],3
> 00401D93   ja          $L61935+6Fh (00401e24)
> 00401D99   mov         edx,dword ptr [ebp-10h]
> 00401D9C   jmp         dword ptr [edx*4+401E47h]
> 697:        case DL_LIST_ADD_TO_FRONT_IF_NEW:
> 698:        case DL_LIST_ADD_TO_FRONT_ALWAYS:
> 699:        {
> 700:           LinkAddBefore(PrevEntry,pEntry);
> 00401DA3   mov         eax,dword ptr [ebp+8]
> 00401DA6   push        eax
> 00401DA7   mov         ecx,dword ptr [ebp-8]
> 00401DAA   push        ecx
> 00401DAB   mov         ecx,dword ptr [ebp-4]
> 00401DAE   call        @ILT+365(DL_List::LinkAddBefore) (00401172)
> 701:           break;
> 00401DB3   jmp         $L61935+6Fh (00401e24) ; --> go to 00401e24
> 702:        }

*** Пришли сюда. Пока все хорошо.

> 715:     ASSERT(pEntry->Parent);
> 00401E24   mov         ecx,dword ptr [ebp+8]
> 00401E27   cmp         dword ptr [ecx+4],0
> 00401E2B   jne         $L61935+92h (00401e47) ; --> ALL OK, go to 00401e47
> 00401E2D   movsx       edx,word ptr [`DL_List::AddEntry'::`2'::__LINE__Var (00422560)]
> 00401E34   add         edx,68h
> 00401E37   push        edx
> 00401E38   push        offset THIS_FILE (00422520)
> 00401E3D   call        AfxAssertFailedLine (0040e550)
> 00401E42   test        eax,eax
> 00401E44   je          $L61935+92h (00401e47)
> 00401E46   int         3

*** ЗАМИНИРОВАНО ***

> 00401E47   xor         eax,eax ; --> !!! SHIT HERE !!!

*** Возвращаемое функцией значение СБРОШЕНО в FALSE

> 00401E49   test        eax,eax
> 00401E4B   jne         $L61935+6Fh (00401e24) ; --> Verified. All OK. Go to Next.

*** Это то, что написано в исходном тексте программы - вернуть TRUE:

> 716:     return TRUE;
> 717:  }

*** А это то, что делается в коде на самом деле - возвращается FALSE:

   /*
      Старый демотиватор вспоминается:
      
      #define  TRUE     (FALSE)  // Счастливой отладки, суки !
   */

> 00401E4D   pop         edi ; Just RETURN FALSE instead TRUE !!!!!
> 00401E4E   pop         esi
> 00401E4F   pop         ebx
> 00401E50   add         esp,50h
> 00401E53   cmp         ebp,esp
> 00401E55   call        _chkesp (0040e574)
> 00401E5A   mov         esp,ebp
> 00401E5C   pop         ebp
> 00401E5D   ret         8




Пришлось проверку убрать...

> // Just a shit !
> // ASSERT clear EAX, but return TRUE do Nothing!
> // As result, we got FALSE instead !!!
> //   ASSERT(pEntry->Parent);  // WTF ????????????????
>    return TRUE;


© Gazlan 2012 * gazlan@yandex.ru

Hit Counter