Не устаю поражаться изобретательности ребят из 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;
|