آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

کدهای نا امن(Unsafe Code) مربوط به C#

دوره های مرتبط با این مقاله

کدهای نا امن

C# زمانی که تابعی از بلوک کد توسط اصلاح‌کننده‌ی نا امن نشان شده است، امکان استفاده از متغیرهای اشاره‌گر را در این تابع فراهم کرده است. کد نا امن یا کد مدیریت نشده بلوکی از کد است که از یک متغیر اشاره‌گر استفاده می‌کند.


نکته:

جهت اجرای برنامه‌های بیان شده در این فصل در codingground لطفاً تنظیمات کامپایل را در
Project >> Compile Options >> Compilation Command
بر روی mcs *.cs -out:main.exe -unsafe" قرار دهید.


اشاره‌گرها

اشاره‌گرها متغیرهایی هستند که مقدار آن‌ها آدرس متغیر دیگر یا همان آدرس مستقیم مکان حافظه است. شبیه به متغیرها یا ثابت‌های دیگر، جهت ذخیره‌سازی هر آدرسی از متغیر قبل از آن که بتوانید از اشاره‌گر استفاده کنید، باید آن را اعلان کنید.
فرم کلی اعلان اشاره‌گرها به صورت زیر است:

type *var-name;

int *ip;/* pointer to an integer */
double *dp;/* pointer to a double */
float *fp;/* pointer to a float */
char *ch/* pointer to a character */

در مثال زیر با استفاده از اصلاح‌کننده‌ی نا امن، کاربرد اشاره‌گرها در C# نشان داده شده است:

                            using System;
namespace UnsafeCodeApplication {
 class Program {
 static unsafe void Main(string[] args) {
 int var = 20;
 int* p = & var;
         
 Console.WriteLine("Data is: {0} ", var);
 Console.WriteLine("Address is: {0}", (int)p);
 Console.ReadKey();
 }
 }
}

زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده می‌شود:

Data is: 20
Address is: 99215364

به جای اعلان کل متد به عنوان یک متد نا امن می‌توانید بخشی از کد را به عنوان کد نا امن اعلان کنید. در مثال زیر به این مطلب پرداخته شده است.

بازیابی مقادیر داده‌ها با استفاده از اشاره‌گر

می‌توانید با استفاده از متد ToString() داده‌های ذخیره‌شده در محلی که توسط متغیر اشاره‌گر به آن اشاره شده است را بازیابی کنید. این مطلب در مثال زیر نشان داده شده است:

using System;
namespace UnsafeCodeApplication {
 class Program {
 public static void Main() {
 unsafe {
 int var = 20;
 int* p = & var;
            
 Console.WriteLine("Data is: {0} ", var);
 Console.WriteLine("Data is: {0} ", p->ToString());
 Console.WriteLine("Address is: {0} ", (int)p);
 }
 Console.ReadKey();
 }
 }
}

زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده می‌شود:

Data is: 20
Data is: 20
Address is: 77128984

رد کردن اشاره‌گرها به عنوان پارامتر به متدها

می‌توانید متغیرهای اشاره‌گر را به عنوان پارامتر به متدها رد کنید. در مثال زیر این مطلب نشان داده شده است:

using System;
namespace UnsafeCodeApplication {
 class TestPointer {
 public unsafe void swap(int* p, int *q) {
 int temp = *p;
 *p = *q;
 *q = temp;
 }
 public unsafe static void Main() {
 TestPointer p = new TestPointer();
 int var1 = 10;
 int var2 = 20;
 int* x = &var1;
 int* y = &var2;
         
 Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2);
 p.swap(x, y);
 Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2);
 Console.ReadKey();
 }
 }
}

زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده می‌شود:


Before Swap: var1: 10, var2: 20
After Swap: var1: 20, var2: 10

دسترسی به عناصر آرایه با استفاده از یک اشاره‌گر

در C# اسم یک آرایه و اشاره‌گر یک نوع از داده مانند داده‌ی آرایه، نوع متغیر یکسانی ندارند. برای مثال int *p و int[] p نوع یکسانی ندارند. می‌توانید متغیر اشاره‌گر p را یک واحد افزایش دهید، زیرا این متغیر در حافظه ثابت نیست، اما آدرس یک آرایه در حافظه ثابت است و نمی‌توانید آن را افزایش دهید.

بنابراین اگر می‌خواهید با استفاده از متغیر اشاره‌گر به داده‌های یک آرایه دسترسی پیدا کنید، همان طور که در C یا C++ مرسوم است، باید با استفاده از واژه‌ی کلیدی fixed این اشاره‌گر را ثابت کنید.
در مثال زیر به این مطلب پرداخته شده است:

using System;
namespace UnsafeCodeApplication {
 class TestPointer {
 public unsafe static void Main() {
 int[] list = {10, 100, 200};
 fixed(int *ptr = list)
         
/* let us have array address in pointer */
 for (int i = 0; i < 3; i++) {
 Console.WriteLine("Address of list[{0}]={1}",i, (int)(ptr + i));
 Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
 }
         
 Console.ReadKey();
 }
 }
}

زمانی که کد بالا کامپایل و اجرا شود، نتیجه به صورت زیر نمایش داده می‌شود:

Address of list[0] = 31627168
Value of list[0] = 10
Address of list[1] = 31627172
Value of list[1] = 100
Address of list[2] = 31627176
Value of list[2] = 200

کامپایل کدهای نا امن

جهت کامپایل کردن این کدها باید سوئیچ خط فرمان /unsafe را به همراه کامپایلر خط فرمان مشخص کنید.
برای مثال اگر بخواهید برنامه‌ی prog1.cs که شامل کد نا امن است را از خط فرمان کامپایل کنید، باید از دستور زیر استفاده کنید:

csc /unsafe prog1.cs

اگر از Visual Studio IDE استفاده می‌کنید باید در properties پروژه‌ی خود، امکان استفاده از کد نا امن را فراهم کنید.
برای انجام این کار:

  • بر روی گره‌ی properties در Solution Explorer دو بار کلیک کنید تا project properties باز شود.
  • بر وی تب build کلیک کنید.
  • “Allow unsafe code” را انتخاب کنید.

  • 139
  •    174
  • تاریخ ارسال :   1397/08/26

دانلود PDF دانشجویان گرامی اگر این مطلب برای شما مفید بود لطفا ما را در GooglePlus محبوب کنید
رمز عبور: tahlildadeh.com یا www.tahlildadeh.com
ارسال دیدگاه نظرات کاربران
شماره موبایل دیدگاه
عنوان پست الکترونیک

ارسال

آموزشگاه برنامه نویسی تحلیل داده
آموزشگاه برنامه نویسی تحلیل داده

تمامی حقوق این سایت متعلق به آموزشگاه تحلیل داده می باشد .