Yes, your expression fatally confuses the JIT optimizer. The generated machine code is as follows:
if ((value == null || value == new string[0]) == false) 00000027 test esi,esi ; value == null? 00000029 je 00000075 0000002b xor edx,edx ; new string[0] 0000002d mov ecx,6D913BD2h 00000032 call FFD20BC8 00000037 cmp eax,esi ; (value == new string[0]) == false? 00000039 je 00000075 { Console.WriteLine("Post-check Value is: " + value); 0000003b mov ecx,dword ptr ds:[03532090h] ; "Post-check value is: " 00000041 xor edx,edx ; BUGBUG not null! 00000043 call 6D70B7E8 ; String.Concat() 00000048 mov esi,eax ; 0000004a call 6D72BE08 ; get Console.Out 0000004f mov ecx,eax 00000051 mov edx,esi 00000053 mov eax,dword ptr [ecx] 00000055 call dword ptr [eax+000000D8h] ; Console.WriteLine()
The error occurs at address 41, the optimizer concluded that the value will always be zero, so it directly passes null to String.Concat ().
For comparison, this is the code that is generated when JIT optimization is disabled:
Console.WriteLine("Post-check Value is: " + value); 00000056 mov ecx,dword ptr ds:[03342090h] 0000005c mov edx,dword ptr [ebp-8] 0000005f call 6D77B790
The code has been moved, but note that at address 5c it now uses a local variable (value) instead of null.
You can report this error on connect.microsoft.com. The workaround is simple:
if (value != null) { Console.WriteLine("Post-check Value is: " + value); new PrintManager().Print("blah", value); }
Hans Passant Jan 25 '10 at 21:46 2010-01-25 21:46
source share