To rzeczywiście błąd zespołu. x64, .net 4.7.1, kompilacja wydania.
demontaż:
for(int i = 0; i < N - Old.Length; i++)
00007FF942690ADD xor eax,eax
for(int i = 0; i < N - Old.Length; i++)
00007FF942690ADF mov ebx,esi
00007FF942690AE1 sub ebx,ebp
00007FF942690AE3 test ebx,ebx
00007FF942690AE5 jle 00007FF942690AFF
dd[i] = d;
00007FF942690AE7 mov rdx,qword ptr [rdi]
00007FF942690AEA cmp eax,dword ptr [rdx+8]
00007FF942690AED jae 00007FF942690B11
00007FF942690AEF movsxd rcx,eax
00007FF942690AF2 vmovsd qword ptr [rdx+rcx*8+10h],xmm6
for(int i = 0; i < N - Old.Length; i++)
00007FF942690AF9 inc eax
00007FF942690AFB cmp ebx,eax
00007FF942690AFD jg 00007FF942690AE7
00007FF942690AFF vmovaps xmm6,xmmword ptr [rsp+20h]
00007FF942690B06 add rsp,30h
00007FF942690B0A pop rbx
00007FF942690B0B pop rbp
00007FF942690B0C pop rsi
00007FF942690B0D pop rdi
00007FF942690B0E pop r14
00007FF942690B10 ret
Problem jest pod adresem 00007FF942690AFD, jg 00007FF942690AE7. Skacze z powrotem, jeśli ebx (który zawiera 4, wartość końcową pętli) jest większy (jg) niż eax, wartość i. To kończy się niepowodzeniem, gdy jest to oczywiście 4, więc nie zapisuje ostatniego elementu w tablicy.
Nie udaje się, ponieważ wartość rejestru inc jest i (eax, na 0x00007FF942690AF9), a następnie sprawdza ją z 4, ale nadal musi zapisać tę wartość. Trochę trudno jest dokładnie określić, gdzie dokładnie znajduje się problem, ponieważ wygląda na to, że może być wynikiem optymalizacji (N-Old.Length), ponieważ kompilacja debugowania zawiera ten kod, ale kompilacja wydania oblicza to wstępnie. Więc to dla jitów do naprawienia;)