Es ist in der Tat ein Montagefehler. x64, .net 4.7.1, Release Build.
Demontage:
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
Das Problem ist unter der Adresse 00007FF942690AFD, der jg 00007FF942690AE7. Es springt zurück, wenn ebx (das 4 enthält, den Endwert der Schleife) größer (jg) ist als eax, der Wert i. Dies schlägt natürlich fehl, wenn es 4 ist, sodass nicht das letzte Element in das Array geschrieben wird.
Es schlägt fehl, weil es den Registerwert von i (eax, bei 0x00007FF942690AF9) enthält und es dann mit 4 überprüft, aber es muss diesen Wert noch schreiben. Es ist etwas schwierig zu bestimmen, wo genau sich das Problem befindet, da es möglicherweise das Ergebnis der Optimierung von (N-Old.Length) ist, da der Debug-Build diesen Code enthält, der Release-Build dies jedoch vorberechnet. Das müssen die Leute also reparieren;)