SORU
9 HAZİRAN 2011, PERŞEMBE


Soran Yansıması sonucu ne olur Sistem üzerine yazmak için API.String.Boş?

Bu kod rastladım:

static void Main()
{
    typeof(string).GetField("Empty").SetValue(null, "evil");//from DailyWTF

    Console.WriteLine(String.Empty);//check

    //how does it behave?
    if ("evil" == String.Empty) Console.WriteLine("equal"); 

    //output: 
    //evil 
    //equal

 }

ve hatta mümkünse bu kod parçası derlemek için nasıl acaba. Benim akıl:

String.Empty imkansız olması gereken salt okunur bu nedenle değişiyor Senior ve "" veya benzer bir hata. atanamaz statik salt okunur Bir alan ile bitmelidir derleme

Temel Sınıf Kütüphanesi derlemeler efsunlu ve saldırı tam da bu tür önlemek için imzalı falan vardır diye düşündüm. Bir dahaki sefere birisi Sistem değişebilir.Güvenlik.Kriptografi ya da başka bir önemli sınıf.

Temel Sınıf Kütüphanesi derlemeler NGEN sonra tarafından derlenen düşündüm .NET yükleme bu nedenle String sınıfı alanı değiştirmek için gelişmiş hack gerektirir ve çok daha zor olmalı.

Ve henüz bu kod derlenir ve çalışır. Biri benim akıl ile sorunun ne olduğunu açıklayabilecek olan var mı?

CEVAP
9 HAZİRAN 2011, PERŞEMBE


Statik salt okunur bir alan atanamaz

Bu atama değilsin. System.Reflection ad kamu görevleri diyorsun. Bundan şikayet derleyici için bir sebep yok.

Ayrıca, typeof(string).GetField("Empty") işine yarayacağını değişkenler girilen kullanıcı tarafından yerine başka emin yolu için derleyici söylemek her zaman olup olmadığını tartışmaya GetField son "Empty".

Reflection alan initonly işaretli ve çalışma zamanında bir hata atmak olduğunu görmek istiyorsun sanırım. O, henüz beyaz kutu testi için beklediğiniz anlayabiliyorum, initonly alanlar için yazılı Bazı uygulama var hatta.

NGEN hiçbir etkisi olmaz bu nedenle burada herhangi bir kod, veri değiştirme sadece sen değilsin. Veri hafızada saklanır .Başka bir dil gibi NET. Yerel programlar dize sabitleri gibi şeyler için salt okunur bellek bölümleri kullanabilirsiniz, ama dize için işaretçi genellikle hala yazılabilir ve burada neler olduğunu.

Kodunuzu tam güven ile çalışan bu şüpheli şekilde yansıma kullanmak için olması gerektiğini unutmayın. Ayrıca, değişiklik yalnızca etkileyen bir program, bu değil, herhangi türden bir güvenlik açığı olarak mi diyorsun (eğer çalışan zararlı kod içinde sürecinize tam güvenin, bu tasarım kararı, güvenlik sorunu değil, yansıma).


Daha fazla mscorlib.dll içinde initonly alanların değerlerini küresel değişmezler olduğunu unutmayın .NET çalışma zamanı. Onları kırdıktan sonra bile sabit kod Sistemi geçerli değerini incelemek için, çünkü kırık olup olmadığını güvenilir bir şekilde test edebilirsiniz.String.Boş da değişmezler ihlal ettin çünkü kırıldı. Sistem değişmezler ihlal etmeden ve hiçbir şey güvendi.

İçeride bu değerler belirterek .NET teknik özellikler, performans iyileştirmeleri bir sürü uygulamak için derleyici sağlar. Sadece basit bir açıklama

s == System.String.Empty

ve

(s != null) && (s.Length == 0)

eşdeğerdir, ama ikincisi çok daha hızlı (nispeten konuşma).

Ayrıca derleyici belirleyebilirsiniz

if (int.Parse(s) > int.MaxValue)

hiçbir zaman doğru değildir, ve başka blok için koşulsuz bir sıçrama oluşturmak (hala Int32.Parse aynı durum davranışı için aramak, ama karşılaştırma kaldırılabilir).

System.String.Empty da yoğun SERUM uygulamaları içinde kullanılır. Eğer üzerine yazarsanız,bu tarz çılgınlıklar, programınız dışında sızıntı hasar dahil olabilir(örneğin dize manipülasyon kullanılarak inşa edilmiş olan bir dosyaya yazabilirsiniz... dize sonları, yanlış dosyanın üzerine yaz)


Ve davranışı kolayca arasında farklılık gösterebilir .NET sürümleri. Normalde yeni optimizasyon imkanları bulunan, JİT derleyici (ve eğer olsaydı bile, dahil uygulanan önce gelen yüklemeleri olabilir) önceki sürümleri için backported anlamıyorlar. Özellikle. String.Emptyile ilgili iyileştirmeler arasında observably farklıdır .NET 2.x ve Mono ve .NET 4.5 .

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Fullscreen

    Fullscreen

    23 Mart 2006
  • pissengehen

    pissengehen

    26 EYLÜL 2006
  • thelonelyisland

    thelonelyisl

    23 Aralık 2005