2010-05-21 20 views
21

मान लें कि मैं एक मूल्य प्रकार 7 बाइट्स (या 3 या 777) रखना चाहता हूं।एक निश्चित आकार बफर (सरणी) असुरक्षित क्यों होना चाहिए?

मुझे लगता है कि जैसे कि यह परिभाषित कर सकते हैं:

public struct Buffer71 
{ 
    public byte b0; 
    public byte b1; 
    public byte b2; 
    public byte b3; 
    public byte b4; 
    public byte b5; 
    public byte b6; 
} 

इसे परिभाषित करने की एक आसान तरीका एक निश्चित बफर

public struct Buffer72 
{ 
    public unsafe fixed byte bs[7]; 
} 
बेशक

दूसरी परिभाषा सरल है उपयोग कर रहा है। समस्या असुरक्षित कीवर्ड के साथ निहित है जो निश्चित बफर के लिए प्रदान की जानी चाहिए। मैं समझता हूं कि यह पॉइंटर्स का उपयोग करके लागू किया गया है और इसलिए असुरक्षित है।

मेरा सवाल यह है कि इसे असुरक्षित क्यों होना चाहिए? सी # मनमानी निरंतर लंबाई सरणी क्यों प्रदान नहीं कर सकता है और इसे सी # संदर्भ प्रकार सरणी या असुरक्षित बफर बनाने के बजाय उन्हें मूल्य प्रकार के रूप में क्यों रख सकता है?

उत्तर

13

क्योंकि "निश्चित बफर" वास्तविक सरणी नहीं है। यह एक कस्टम मूल्य प्रकार है, जिसे मैं जानता हूं सी # भाषा में से एक उत्पन्न करने का एकमात्र तरीका है। सीएलआर के सत्यापन के लिए कोई रास्ता नहीं है कि सरणी का अनुक्रमण सुरक्षित तरीके से किया जाता है। कोड या तो सत्यापित नहीं है। इस का सबसे ग्राफिक प्रदर्शन:

using System; 

class Program { 
    static unsafe void Main(string[] args) { 
     var buf = new Buffer72(); 
     Console.WriteLine(buf.bs[8]); 
     Console.ReadLine(); 
    } 
} 
public struct Buffer72 { 
    public unsafe fixed byte bs[7]; 
} 

आप मनमाने ढंग से इस उदाहरण में ढेर फ्रेम पहुँच सकते हैं। मानक बफर ओवरफ्लो इंजेक्शन तकनीक फ़ंक्शन रिटर्न पते को पैच करने के लिए दुर्भावनापूर्ण कोड पर उपलब्ध होगी और आपके कोड को मनमाने ढंग से स्थान पर जाने के लिए मजबूर करेगी।

हां, यह काफी असुरक्षित है।

+11

तो क्या समस्या यह है कि सीआईएल को सीमित अनुक्रमित परिचालन करने के किसी भी साधन की कमी है? मुझे कोई अर्थपूर्ण कारण नहीं दिख रहा है कि सीआईएल ऐसी सुविधा क्यों नहीं दे सका। ग्राफिक्स ट्रांसफॉर्म जैसी कुछ चीजें एक संरचना के "आदर्श" 16-बाइट आकार पर थोड़ी सी हो सकती हैं, लेकिन उन्हें तर्कसंगत रूप से उत्परिवर्तनीय मूल्य अर्थशास्त्र होना चाहिए। अपरिवर्तनीय अर्थशास्त्र एक उदाहरण के भीतर एक मूल्य को ट्विक करने के लिए दर्दनाक बनाते हैं, और उत्परिवर्तनीय संदर्भ अर्थशास्त्र अस्पष्टताओं को पेश करते हैं जैसे कि उदा। एक समारोह जो एक उदाहरण देता है वह एक नया उदाहरण या मौजूदा एक वापस करने जा रहा है। – supercat

+0

यह इतना आसान नहीं है कि यह समवर्ती सुरक्षा गारंटी के साथ बहुत सारे मुद्दों को उठाता है। – user1496062

+1

यह पागल है कि संरचना में एक निश्चित आकार के सरणी को एम्बेड करने के लिए कोई * सुरक्षित * तरीका नहीं है। कोड के उच्च प्रदर्शन अनुभागों के लिए मैं केवल 100% ब्लिटेबल structs का उपयोग करना चाहता हूं। कम से कम हमारे पास रिफ रिटर्न और रिफ लोकल हैं। – JBeurer

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