Информация об изменениях

Сообщение Re: [Bug] VS2015 + vectorcall = crash? от 15.09.2016 16:13

Изменено 15.09.2016 16:20 Pavel Dvorkin

Здравствуйте, okman, Вы писали:

O>Обнаружил в Visual C++ 2015 странное поведение. Баг?


В x64 работает нормально.
В x86 вылетает на последней команде


В x64 этот код выглядит так

00007FF61979232F mov rcx,qword ptr [p]
00007FF619792333 call qword ptr [Pfn]

00007FF61979109B jmp parent::`vcall'{8}' (07FF619791A94h)


00007FF619791A94 mov rax,qword ptr [rcx]
00007FF619791A97 jmp qword ptr [rax+8]


В x86

00E82390 mov ecx,dword ptr [p]
00E82393 call dword ptr [Pfn]

00E8107D jmp parent::`vcall'{4}' (0E81A3Fh)

00E81A3F mov eax,dword ptr [esp+4]
00E81A43 mov eax,dword ptr [eax]
00E81A45 jmp dword ptr [eax+4] // здесь и падает

Зачем она в стек полезла, если p в регистре ecx —

Видимо, баг, да.
Здравствуйте, okman, Вы писали:

O>Обнаружил в Visual C++ 2015 странное поведение. Баг?


В x64 работает нормально.
В x86 вылетает на последней команде


В x64 этот код выглядит так

00007FF61979232F mov rcx,qword ptr [p]
00007FF619792333 call qword ptr [Pfn]

00007FF61979109B jmp parent::`vcall'{8}' (07FF619791A94h)


00007FF619791A94 mov rax,qword ptr [rcx]
00007FF619791A97 jmp qword ptr [rax+8]


В x86

00E82390 mov ecx,dword ptr [p]
00E82393 call dword ptr [Pfn]

00E8107D jmp parent::`vcall'{4}' (0E81A3Fh)

00E81A3F mov eax,dword ptr [esp+4]
00E81A43 mov eax,dword ptr [eax]
00E81A45 jmp dword ptr [eax+4] // здесь и падает

Зачем она в стек полезла, если p в регистре ecx —

Если заменить __vectorcall на __fastcall, то вместо последних 3 строк имеем

00251A3F mov eax,dword ptr [ecx]
00251A41 jmp dword ptr [eax+4]

что и должно быть.

Видимо, баг, да.