C# Unsafe Code

Introduction to C# Unsafe Code

C# में जो code memory को directly access करता है वह unsafe code कहा जाता है। Unsafe code की वजह से program में memory leaks create होते है। Memory leaks की वजह से आपकी application attacks और threats के प्रति सुरक्षित नहीं रहती है।

Unsafe code सामान्य code से अलग होता है। Normally जब भी आप कोई program लिखते है तो वह CLR द्वारा manage और execute किया जाता है। CLR ही memory management, type verification और garbage collection जैसे tasks के लिए responsible होता है।

लेकिन unsafe code CLR (Common Language Runtime) द्वारा run और manage नहीं किया जाता है। CLR में unsafe code के लिए कोई specification available नहीं होती है इसलिए CLR unsafe code को verify नहीं करता है। यही कारण है की unsafe code को unmanaged code भी कहा जाता है।

यदि आप अपने program में unsafe code का प्रयोग करते है तो उसे manage (memory allocation, casting, memory release आदि) करना आपकी जिम्मेदारी होती है। इसके अलावा unsafe code की वजह से generate होने वाले security issues के लिए भी आप ही (programmers) जिम्मेदार होते है।

Unsafe code का सबसे popular उदाहरण pointers है। Pointers memory को directly access करते है इसलिए pointers को C# में unsafe माना जाता है।

Pointers के alternative के रूप में C# references provide करती है। References की वजह से C# दूसरी programming languages जैसे की C और C++ आदि से अधिक सुरक्षित हो जाती है।

C# में un-initialised variable, pointer आदि code जो memory को असुरक्षित बनाते है, नहीं define किये जा सकते है। इस तरह के codes द्वारा generate होने वाली bugs जो C और C++ जैसी programming languages में आम बात है C# में eliminate कर दी गयी है।

हालाँकि unsafe code आपकी application को असुरक्षित बनाता है लेकिन कई बार programmer के लिए unsafe code create करना अतिआवश्यक हो जाता है। उदाहरण के लिए यदि आप operating system की memory को manage करना चाहते है तो इसके लिए आपको unsafe code लिखना ही होगा।

ऐसी situations के लिए C# में unsafe context introduce किया गया है। जब भी आप कोई ऐसा code लिखते है जो unsafe है तो उसे unsafe context में लिखते है।

Unsafe context से मतलब है की आप compiler को बताते है की code unsafe है।

unsafe Modifier

Unsafe context में code define करने के लिए unsafe modifier का प्रयोग किया जाता है। इस modifier के प्रयोग से आप methods, types और दूसरे code blocks को unsafe define करते है।

उदाहरण के लिए आपकी एक class है जिसमे आप unsafe code प्रयोग करते है तो उस class को आप इस modifer द्वारा इस प्रकार define करेंगे।

unsafe class myClass
{
     //unsafe code here…
}

/unsafe Compiler Option

Unsafe code को सामान्य code की तरह compile नहीं किया जाता है। Unsafe code को compile करने के लिए /unsafe compiler option का प्रयोग किया जाता है।

उदाहरण के लिए यदि आपके program का नाम myProgram है तो आप उसे इस प्रकार compile करेंगे।

csc /unsafe myProgram.cs

यदि आप application development के लिए Visual Studio Express IDE का प्रयोग कर रहे है तो यह option आपको manually enable करना होगा। By default unsafe code का option disable रहता है।

Unsafe code compilation को enable करने के लिए आप project properties window से build tab select करते है। Build select करने के बाद आप Allow unsafe code को select करके compiler द्वारा unsafe code compilation को enable कर सकते है।

C# Pointers

Pointer variable एक ऐसा variable होता है जो किसी दूसरे variable का memory address store करता है। एक pointer variable किसी memory को directly point करता है। Pointer variable द्वारा किसी memory address पर store की गयी value को access और manipulate किया जा सकता है।

Declaring Pointers

C# में pointers declare करने का general syntax निचे दिया जा रहा है।

data-type * pointer-var-name;
  • data-type – एक pointer variable का data type और उसके द्वारा जिस variable का memory address store किया जाता है दोनों same होने चाहिए।
    • (asterisk) – एक pointer variable * (asterisk) द्वारा define किया जाता है। Asterisk (*) को data type के बाद और pointer variable name से पहले define किया जाता है।
  • pointer-var-name – Pointer variable का नाम किसी भी normal variable की तरह होता है।

Pointer define करने के लिए ऊपर दिया गया तरीका आपको तब प्रयोग करना चाहिए जब आप class या main method को unsafe modifier द्वारा define करते है।

यदि आपने class या main method को unsafe नहीं declare किया है तो आप pointers define करने के लिए unsafe block define कर सकते है। इसका syntax निचे दिया जा रहा है।

unsafe
{
     data-type * pointer-var-name;
}

Pointer से related हर statement unsafe block में ही define किया जाना चाहिए।

Initializing Pointers

एक pointer variable की value किसी दूसरे variable का address होती है। Pointer variable के अंदर दूसरे variable का address store करने के लिए address of (&) operator का प्रयोग किया जाता है। उस variable को पहले declare किया जाता है जिसका address आप pointer variable में store करना चाहते है।

Pointer variable को initialize करने का general syntax निचे दिया जा रहा है।

pointer-var-name = & normal-variable-name;

Accessing Pointer Variables

जब आप एक pointer variable की value को directly print करने का प्रयास करते है तो उस variable का memory address print होता है जिससे आपने pointer variable को initialize किया था।

यदि आप pointer variable द्वारा point की गयी memory location पर store की गयी value को access करना चाहते है तो इसके लिए आपको value-at (*) operator को use करना होता है। इस operator को pointer variable से पूर्व value access करने के लिए प्रयोग किया जाता है।

Example of C# Unsafe Code

C# में unsafe code का प्रयोग निचे उदाहरण द्वारा समझाया जा रहा है।

using System;

unsafe class myClass
{
    static void Main(string[] args)
    {
         int Age = 40;
         int *pAge = &Age;
         Console.WriteLine(*pAge);
    }
}

ऊपर दिया गया उदाहरण निचे दिया गया output generate करता है।

40