SORU
25 Ocak 2010, PAZARTESİ


Hata optimizasyonu derlerken sadece gerçekleşen etkin

Sadece kodu en iyi duruma getirme etkin ile üretilmiştir çoğalan bir hata kodu ile karşılaştım. Bir test için mantık çoğaltır uygulaması (kod aşağıda) konsol yaptım. Optimizasyon etkinleştirildiğinde göreceksiniz 'value' bu geçersiz bir mantık yürütme sonra: null olur

if ((value == null || value == new string[0]) == false)

Düzeltme devam eder ve soruna neden olan kodu aşağıda diye. Ama... çevirici bir hata rastlamak olabilir bu beni daha çok endişelendiriyor ya da başka birinin null olarak ayarlayın. neden bir açıklama vardır.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace memory_testing
{
    class Program
    {
        sta tic void Main(string[] args)
        {
            while(true)
            {
                Console.Write("Press any key to start...");
                Console.ReadKey();
                Console.WriteLine();
                PrintManagerUser c = new PrintManagerUser();
                c.MyProperty = new string[1];
            }
        }
    }

    public class PrintManager
    {
        public void Print(string key, object value)
        {
            Console.WriteLine("Key is: "   key);
            Console.WriteLine("Value is: "   value);
        }
    }

    public class PrintManagerUser
    {
        public string[] MyProperty
        {
            get { return new string[100]; }
            set
            {
                Console.WriteLine("Pre-check Value is: "   value);
                if ((value == null || value == new string[0]) == false)
                {
                    Console.WriteLine("Post-check Value is: "   value);
                    new PrintManager().Print("blah", value);
                }
                //if (value != null && value.Length > 0)
                //{
                //    new PrintManager().Print("blah", value);
                //}
            }
        }
    }
}

Normal çıktı olmalıdır:

Pre-check Value is: System.String[]
Post-check Value is: System.String[]
Key is: blah
Value is: System.String[]

Adamcağız çıktı

Pre-check Value is: System.String[]
Post-check Value is:
Key is: blah
Value is:   

Benim Env bir VM için Windows Server 2003 R2 ile çalışıyor .NET 3.5 SP1. VS2008 Team Sistem kullanarak.

Teşekkürler

Brian

CEVAP
25 Ocak 2010, PAZARTESİ


Evet, ifadenizi ölümcül JİT iyileştirici karıştırır. Üretilen makine kodu bu gibi görünüyor:

                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()

Hata iyileştirici değeri her zaman doğrudan bir Dize için bir boş geçer yani boş olacaktır sonucuna varmıştır 41, adrese oluşur.() Herhangi bir parametre.

Karşılaştırma için, bu TAM optimizasyon kapatıldığında üretilen bir kod

                    Console.WriteLine("Post-check Value is: "   value);
00000056  mov         ecx,dword ptr ds:[03342090h] 
0000005c  mov         edx,dword ptr [ebp-8] 
0000005f  call        6D77B790 

Kod geçtim, ama 5c adrese şimdi boş yerine yerel değişken (değer) kullanır.

Connect.microsoft.com bu hatayı bildirin. Çözüm basit:

  if (value != null)
  {
    Console.WriteLine("Post-check Value is: "   value);
    new PrintManager().Print("blah", value);
  }

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BumbleDroid

    BumbleDroid

    18 EKİM 2010
  • Hidden Wolf TV

    Hidden Wolf

    1 EKİM 2009
  • rekjavicxxx

    rekjavicxxx

    28 EKİM 2007