2011-09-27 27 views
11

मेरे बहु-थ्रेडेड प्रबंधित कार्यक्रम में मेरा ढेर भ्रष्टाचार है। कुछ परीक्षण करने से मुझे पता चला कि भ्रष्टाचार तब होता है जब पृष्ठभूमि में पृष्ठभूमि धागे सक्रिय होते हैं (वे स्विच करने योग्य होते हैं)। धागे कुछ तीसरे पक्ष के घटकों का उपयोग करते हैं।.NET 4: क्या प्रबंधित कोड अकेले भ्रष्टाचार का कारण बन सकता है?

धागे और 3 पार्टी घटकों के कोड (.NET परावर्तक के साथ) परीक्षण करने के बाद मैंने पाया कि वे सभी प्रबंधित कर रहे हैं, अर्थात कोई "असुरक्षित" या "DllImportAttribute" या "पी/आह्वान"। ऐसा लगता है कि पूरी तरह से प्रबंधित कोड एक ढेर भ्रष्टाचार का कारण बनता है, क्या यह संभव है?

अद्यतन मार्शल वर्ग का उपयोग करने से

अलावा, यह भ्रष्ट करने के लिए संभव धागे के साथ ढेर सही ढंग से सिंक्रनाइज़ नहीं किया जा रहा है? एक उदाहरण की बहुत सराहना की जाएगी।

+2

सिर्फ इसलिए कि वे कर रहे हैं के साथ है सभी प्रबंधित, इसका मतलब यह नहीं है कि सबकुछ थ्रेड सुरक्षित है। क्या आप सुनिश्चित कर रहे हैं कि लॉक सुरक्षित तरीके से कोड निष्पादित करता है, ताले आदि का उपयोग करते हुए जहां आवश्यक हो? –

+0

मार्शल क्लास विधियां भी हैं जो यह कर सकती हैं। –

+2

@ क्रिससुनवे, क्या आप कह रहे हैं कि गैर-थ्रेड-सुरक्षित तरीके से अनुचित लॉकिंग या थ्रेड निष्पादित करना मार्शल क्लास का उपयोग किये बिना भी ढेर को दूषित कर सकता है? मेरे पास एक जवाब था कि यह संभव नहीं है ([यहां] (http://stackoverflow.com/questions/7471288/what-tools-are- उपलब्ध-to-detect-heap-corruption-in-net-c-program/ 7471468 # 7471468))। –

उत्तर

12

असुरक्षित कोड के किसी भी उपयोग के बिना ढेर को भ्रष्ट करना निश्चित रूप से संभव है। मार्शल वर्ग अपने दोस्त/दुश्मन यहाँ

IntPtr ptr = new IntPtr(50000); // Random memory 
byte[] b = new byte[100]; 
Marshalp.Copy(b, 0, ptr, 100); 

यह प्रभावी रूप से प्रतियां 100 लगातार 0 ढेर में के पते पर है 50000.

एक और तरीका स्पष्ट struct लेआउट

[StructLayout(LayoutKind.Explicit)] 
struct S1 
{ 
    [FieldOffset(0)] 
    internal string str; 

    [FieldOffset(0)] 
    internal object obj; 
} 

S1 s = new S1(); 
s.obj = new Program(); 
s.str.Trim(); // Hope that works ... :) 
+0

पुन। structs, आम '[स्ट्रक्चरलाउट (लेआउटकिंड। आवश्यक)] 'ढेर भ्रष्टाचार का कारण नहीं होगा, है ना? –

+0

@net_prog संख्या, इस चाल के लिए काम/क्रैश करने के लिए 'layoutKind.Explicit' की आवश्यकता है :) – JaredPar

+0

* सामान्य * में @net_prog * प्रबंधित कोड के लिए ढेर को भ्रष्ट करने के लिए यह संभव नहीं है। ये कुछ ही हैं ... चरम मामले जो इसका कारण बन सकते हैं। यह * संभव * हालांकि असंभव है कि आपने एक सीएलआर बग मारा। – JaredPar

संबंधित मुद्दे