برنامه نویسی

آشنایی با انواع داده ها، آسیب پذیری ها و تفاوت های کلیدی C++ با جاوا

Summarize this content to 400 words in Persian Lang
این مقاله نگاهی عمیق به انواع داده‌های مختلف در C++، از جمله انواع اولیه، مشتق‌شده و تعریف‌شده توسط کاربر، ارائه می‌کند، در حالی که آسیب‌پذیری‌های رایج مانند سرریز بافر و تبدیل‌های نوع نادرست را نیز بررسی می‌کند. علاوه بر این، تفاوت‌های کلیدی بین C++ و جاوا را برجسته می‌کند، با تمرکز بر نحوه مدیریت هر زبان با انواع داده‌ها و مدیریت حافظه، با مثال‌های کد عملی برای برنامه‌نویسی ایمن.

جاوا و سی پلاس پلاس دو زبان برنامه نویسی شی گرا (OOP) هستند که مزایا و معایبی دارند. این مقاله برخی از تفاوت‌های این دو زبان را با تمرکز بر انواع داده‌های C++ و آسیب‌پذیری بررسی می‌کند. و همچنین، مثال کد در و همچنین، مثال‌های کد در مورد نحوه جلوگیری از مسائل رایج مانند سرریز بافر، سرریز اعداد صحیح، تبدیل‌های نادرست نوع و عدم ارجاع اشاره گر تهی در C++.

انواع داده های C++

در C++، به طور کلی سه نوع داده وجود دارد: انواع داده های اولیه (یا داخلی)، انواع داده های مشتق شده، و انواع داده های تعریف شده توسط کاربر، به شکل 1 مراجعه کنید:

شکل 1C/C++ انواع داده هاتوجه داشته باشید: از «C++ Types Data Types» اثر Argarwal (2023)

انواع اولیه نیز به عنوان انواع بنیادی اشاره می‌کنند، انواع داده‌های پایه که از پیش تعریف شده‌اند

در C++، فهرستی از آنها را در زیر ببینید:

عدد صحیح (int): اعداد کامل را ذخیره می کند، معمولاً به 4 بایت حافظه نیاز دارند و دارای دامنه ای از 2,147,483,648- تا 2,147,483,647 هستند (Argarwal, 2023)

جدول 1C++ اعداد صحیحتوجه داشته باشید: از «انواع بنیادی» توسط مرجع C++ (nd)

شخصیت (کاراکتر): کاراکتر، نیاز، 1 بایت را ذخیره می کند و دارای محدوده 128- تا 127 (یا 0 تا 255 برای کاراکتر بدون علامت) است. توجه داشته باشید که آنها از نظر فنی اعداد صحیح مثبت هستند که کاراکترها را به صورت اعداد صحیح با استفاده از کدهای اسکی زیرین خود ذخیره می کنند.

کاراکتر عریض (wchar_t) کاراکترهای گسترده ای را ذخیره می کند که معمولاً بسته به پلتفرم به 2 یا 4 بایت نیاز دارد.

بولی (بول): مقادیر منطقی درست یا نادرست را ذخیره می کند، معمولاً به 1 بایت نیاز دارد. آنها از نظر فنی اعداد صحیح مثبت هستند، جایی که O درست است، همه اعداد صحیح مثبت دیگر نادرست هستند.

نقطه شناور (شناور): اعداد ممیز شناور تک دقیق را ذخیره می کند که معمولاً به 4 بایت نیاز دارند.

دوبل (دوبل): اعداد ممیز شناور با دقت دو برابر را ذخیره می کند که به 8 بایت نیاز دارند

دوبل بلند – نوع ممیز شناور با دقت گسترده. لزوماً به انواع تعیین شده توسط IEEE-754 نگاشت نمی شود. (مرجع C++ , nd, p.1)

باطل (باطل): با مجموعه ای خالی از مقادیر یا عدم وجود مقدار، تایپ کنید که اغلب در توابعی استفاده می شود که هیچ مقداری را بر نمی گرداند.

با مجموعه ای خالی از مقادیر تایپ کنید. این یک نوع سایت خارجی ناقص است. که نمی تواند تکمیل شود (در نتیجه، اشیاء از نوع void مجاز نیستند). هیچ آرایه‌ای از void وجود ندارد، و نه ارجاعی به void وجود دارد. با این حال، اشاره گر به باطل. و توابعی که نوع void را برمی‌گردانند (روش‌ها در زبان‌های دیگر) مجاز هستند.” (مرجع C++ , nd, p.1)

انواع داده های مشتق شده از انواع داده های اولیه مشتق شده اند و عبارتند از:

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

نوع داده های تعریف شده توسط کاربر، همانطور که از نام می گوید توسط کاربر تعریف می شود

کلاس: متغیرها و توابع را در یک واحد ذخیره می کند.

ساختار (ساختار): مشابه کلاس ها اما با دسترسی پیش فرض عمومی.

اتحادیه: انواع داده های مختلف را در یک مکان حافظه ذخیره می کند.

شمارش (enum): مجموعه‌ای از نام‌های مرتبط با یک ثابت عدد صحیح، به‌طور گسترده در صنعت بازی‌های ویدیویی استفاده می‌شود.

Typedef: اجازه ایجاد یا اختصاص نام های جدید برای انواع داده های موجود.

تفاوت های اصلی بین مدل ها: C++ در مقابل جاوا

قبل از فهرست کردن تفاوت‌های بین C++ و نوع داده جاوا، می‌خواهم تفاوت‌ها و شباهت‌های اصلی بین این دو زبان را مورد بحث قرار دهم.

هر دو زبان برنامه نویسی شی گرا (OOP) هستند. با این حال، C++ وابسته به پلتفرم است، در حالی که جاوا به دلیل مولفه ماشین مجازی جاوا (JVM) مستقل از پلتفرم است که جاوا را با استفاده از یک مفسر به بایت کد کامپایل می کند، که می تواند روی هر سیستمی با JVM اجرا شود. قابلیت Write Once, Run Anywhere” (Eck, 2015). علاوه بر این، C++ از برنامه نویسی رویه ای و شی گرا پشتیبانی می کند، در حالی که جاوا کاملاً OPP است و C++ را برای برنامه نویسی سیستم عامل ها مناسب تر می کند. علاوه بر این، جاوا که کاملاً شی گرا است، از متغیرهای سراسری یا توابع آزاد پشتیبانی نمی کند (همانطور که C++ انجام می دهد). جاوا همه چیز را در کلاس ها کپسوله می کند.

انواع داده ها تفاوت بین C++ و جاوا

در زیر لیستی از تفاوت های نوع داده بین C++ و جاوا آمده است.

هر دو زبان دارای انواع داده های اولیه هستند. با این حال، C++ از هر دو نوع امضا شده و بدون علامت پشتیبانی می‌کند، که باعث می‌شود انواع داده‌های اولیه C++ انعطاف‌پذیرتر شوند، اما در صورت بدون امضا، امنیت کمتری نیز دارند. انواع داده های اولیه جاوا به طور پیش فرض امضا می شوند (Eck, 2015).
انواع داده های اولیه جاوا اندازه های ثابتی دارند و مستقل از پلتفرم هستند، در حالی که اندازه های ذخیره سازی انواع داده های اولیه C++ وابسته به پلتفرم هستند.
C++ بین انواع اولیه و شیء سازگاری ایجاد می کند. جاوا همچنین بین چیزهای اولیه و اشیاء تمایز قائل می شود. با این حال، برای انواع ابتدایی مانند Integer برای int، «کلاس‌های wrapper» دارد که به آن‌ها اجازه می‌دهد رفتار شی‌مانندی داشته باشند (Sruthy, 2024).
جاوا از انواع داده های ساختاری یا اتحادیه پشتیبانی نمی کند، در حالی که C++ از آن پشتیبانی می کند.
C++ از اشاره گرها و انواع مرجع پشتیبانی می کند، در حالی که جاوا پشتیبانی بسیار محدودی دارد. این با انتخاب و به دلایل امنیتی است.
متغیرهای C++ دارای دامنه جهانی و همچنین دامنه فضای نام هستند. از سوی دیگر، متغیرهای جاوا دامنه جهانی ندارند. با این حال، آنها می توانند محدوده بسته را داشته باشند.
جاوا از نظرات مستندات “Javadocs” پشتیبانی می کند، در حالی که C++ اینطور نیست.

آسیب پذیری های احتمالی هنگام استفاده از انواع داده های C++

اگر نوع داده های C++ به درستی مدیریت نشود ممکن است مشکلات امنیتی ایجاد کند. بنابراین، درک و شناسایی آسیب‌پذیری‌های نوع داده C++ بسیار مهم است. در زیر لیستی از رایج‌ترین آسیب‌پذیری‌هایی که ممکن است با مدیریت انواع داده‌های C++ و نحوه کاهش آن‌ها ایجاد شود، آمده است.

1. سرریز بافر

سرریز بافر زمانی اتفاق می افتد که داده های نوشته شده در حافظه از ظرفیت تخصیص داده شده توسط بافر فراتر رود. این می تواند منجر به خرابی برنامه یا اجرای کد مخرب شود. برای جلوگیری از سرریز بافر، مهم است که مرزها را قبل از کدنویسی بررسی کنید و از توابع کتابخانه ای مقاوم در برابر سرریز بافر مانند “fgets” استفاده کنید. از استفاده از «scanf»، «strcpy»، «printf»، «get» و «strcaf» که مستعد سرریز شدن بافر هستند خودداری کنید (GuardRails، 2023).

نمونه کد زیر را ببینید.

#include
#include

int main() {
char buffer[10];
std::cout << “Enter a string: “;
fgets(buffer, sizeof(buffer), stdin); // Avoids buffer overflow by
// limiting input
std::cout << “You entered: ” << buffer << std::endl;
return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. سرریز و زیر جریان عدد صحیح

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

برای جلوگیری از سرریز و زیر جریان اعداد صحیح، همیشه مقادیر را قبل از انجام عملیات حسابی اعتبار سنجی کنید، به مثال کد زیر مراجعه کنید:

#include
#include // For INT_MAX int add(int a, int b) {
if (a > 0 && b > INT_MAX – a) {
std::cerr << “Integer overflow detected!” << std::endl;
return -1;
}
return a + b;
}

int main() {
int x = INT_MAX – 1;
int y = 2;
std::cout << “Result: ” << add(x, y) << std::endl;
return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که قبل از اضافه کردن a و b، در تابع add، شرط اضافه کردن آنها باعث سرریز می شود بررسی می شود، در اینجا مجموع از حداکثر مقدار مجاز عدد صحیح بیشتر است.

3. تبدیل نوع نادرست

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

به عنوان مثال کد زیر را ببینید:

#include

void checkLength(int len) {
if (len < 0) {
std::cerr << “Negative length detected!” << std::endl;
return;
}
std::cout << “Length is: ” << len << std::endl;
}

int main() {
// Incorrect implicit conversion
unsigned int value = -5; // unsigned int are always non-negative
checkLength(static_cast(value)); // Properly handle conversion
return 0;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. مقداردهی اولیه اشاره گر

نشانگرهای تهی یک آسیب پذیری شناخته شده هستند که می توانند منجر به خرابی برنامه و سوءاستفاده احتمالی ناخوشایند شوند. همیشه نشانگرها را برای “nullptr” قبل از عدم ارجاع آنها بررسی کنید.

برای نمونه کد زیر را ببینید.

struct list {
void *p;
struct list *next;
};

int f(struct list *l) {
int max = -1;
while (l) {
int i = *((int*)l->p); // Cast void* to int*
max = i > max ? i : max;
l = l->next;
}
return max;
}

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که “void” برای ذخیره یک اشاره گر عمومی در لیست پیوند شده استفاده می شود و قبل از استفاده به “int” فرستاده می شود.

به طور خلاصه، درک تفاوت بین جاوا و C++، با درک انواع داده های C++، همراه با خطرات مرتبط با آنها، برای نوشتن برنامه های ایمن بسیار مهم است. این را می توان با مدیریت دقیق انواع داده، انجام بررسی کرانه ها، اعتبارسنجی تبدیل نوع، و مدیریت ایمن نشانگرها، مانند بررسی مقادیر تهی و ارسال صحیح نشانگرهای خالی، انجام داد.

مراجع:

Adam, J. & Kell, S. (2020). بررسی تایپ فراتر از چکرزهای نوع، از طریق Slice & Run. در مجموعه مقالات یازدهمین کارگاه بین المللی ACM SIGPLAN در مورد ابزارهایی برای تجزیه و تحلیل خودکار برنامه (TAPAS 2020). انجمن ماشین های محاسباتی، 23-29. برگرفته از: https://dl-acm-org.csuglobal.idm.oclc.org/doi/10.1145/3427764.3428324

Argarwal, H. (2023, 23 سپتامبر). انواع داده های C++ GoogsforGeeks. https://www.geeksforgeeks.org/cpp-data-types/

مرجع C++ (nd). انواع بنیادی cppreference.com. https://en.cppreference.com/w/cpp/language/types/

اک، دی جی (2015). فصل 1 نمای کلی: چشم انداز ذهنی. مقدمه ای بر برنامه نویسی با استفاده از جاوا (ویرایش هفتم). CC BY-NC-SA 3.0. http://math.hws.edu/javanotes/

GuardRails، (2023، 27 آوریل). آسیب پذیری های امنیتی برتر C++ و نحوه کاهش آنها. بلوار امنیتی. https://securityboulevard.com/2023/04/the-top-c-security-vulnerabilities-and-how-to-mitigate-them/

تیم تحقیقاتی امنیتی Snyk (2022، 16 اوت). Snyk.https://snyk.io/blog/top-5-c-security-risks/

Sruthy، (2024، 7 مارس). C++ در مقابل Java: 30 تفاوت برتر بین C++ و Java با مثال. راهنمای تست نرم افزار. https://www.softwaretestinghelp.com/cpp-vs-java/

در ابتدا در Alex.omegapy در Medium منتشر شده توسط Level UP Coding در 12 اکتبر 2024 منتشر شد.

این مقاله نگاهی عمیق به انواع داده‌های مختلف در C++، از جمله انواع اولیه، مشتق‌شده و تعریف‌شده توسط کاربر، ارائه می‌کند، در حالی که آسیب‌پذیری‌های رایج مانند سرریز بافر و تبدیل‌های نوع نادرست را نیز بررسی می‌کند. علاوه بر این، تفاوت‌های کلیدی بین C++ و جاوا را برجسته می‌کند، با تمرکز بر نحوه مدیریت هر زبان با انواع داده‌ها و مدیریت حافظه، با مثال‌های کد عملی برای برنامه‌نویسی ایمن.

جاوا و سی پلاس پلاس دو زبان برنامه نویسی شی گرا (OOP) هستند که مزایا و معایبی دارند. این مقاله برخی از تفاوت‌های این دو زبان را با تمرکز بر انواع داده‌های C++ و آسیب‌پذیری بررسی می‌کند. و همچنین، مثال کد در و همچنین، مثال‌های کد در مورد نحوه جلوگیری از مسائل رایج مانند سرریز بافر، سرریز اعداد صحیح، تبدیل‌های نادرست نوع و عدم ارجاع اشاره گر تهی در C++.

انواع داده های C++

در C++، به طور کلی سه نوع داده وجود دارد: انواع داده های اولیه (یا داخلی)، انواع داده های مشتق شده، و انواع داده های تعریف شده توسط کاربر، به شکل 1 مراجعه کنید:

شکل 1
C/C++ انواع داده ها
C/C++ انواع داده ها
توجه داشته باشید: از «C++ Types Data Types» اثر Argarwal (2023)

  • انواع اولیه نیز به عنوان انواع بنیادی اشاره می‌کنند، انواع داده‌های پایه که از پیش تعریف شده‌اند

در C++، فهرستی از آنها را در زیر ببینید:

عدد صحیح (int): اعداد کامل را ذخیره می کند، معمولاً به 4 بایت حافظه نیاز دارند و دارای دامنه ای از 2,147,483,648- تا 2,147,483,647 هستند (Argarwal, 2023)

جدول 1
C++ اعداد صحیح
C++ اعداد صحیح
توجه داشته باشید: از «انواع بنیادی» توسط مرجع C++ (nd)

شخصیت (کاراکتر): کاراکتر، نیاز، 1 بایت را ذخیره می کند و دارای محدوده 128- تا 127 (یا 0 تا 255 برای کاراکتر بدون علامت) است. توجه داشته باشید که آنها از نظر فنی اعداد صحیح مثبت هستند که کاراکترها را به صورت اعداد صحیح با استفاده از کدهای اسکی زیرین خود ذخیره می کنند.

کاراکتر عریض (wchar_t) کاراکترهای گسترده ای را ذخیره می کند که معمولاً بسته به پلتفرم به 2 یا 4 بایت نیاز دارد.

بولی (بول): مقادیر منطقی درست یا نادرست را ذخیره می کند، معمولاً به 1 بایت نیاز دارد. آنها از نظر فنی اعداد صحیح مثبت هستند، جایی که O درست است، همه اعداد صحیح مثبت دیگر نادرست هستند.

نقطه شناور (شناور): اعداد ممیز شناور تک دقیق را ذخیره می کند که معمولاً به 4 بایت نیاز دارند.

دوبل (دوبل): اعداد ممیز شناور با دقت دو برابر را ذخیره می کند که به 8 بایت نیاز دارند

دوبل بلند – نوع ممیز شناور با دقت گسترده. لزوماً به انواع تعیین شده توسط IEEE-754 نگاشت نمی شود. (مرجع C++ , nd, p.1)

باطل (باطل): با مجموعه ای خالی از مقادیر یا عدم وجود مقدار، تایپ کنید که اغلب در توابعی استفاده می شود که هیچ مقداری را بر نمی گرداند.

با مجموعه ای خالی از مقادیر تایپ کنید. این یک نوع سایت خارجی ناقص است. که نمی تواند تکمیل شود (در نتیجه، اشیاء از نوع void مجاز نیستند). هیچ آرایه‌ای از void وجود ندارد، و نه ارجاعی به void وجود دارد. با این حال، اشاره گر به باطل. و توابعی که نوع void را برمی‌گردانند (روش‌ها در زبان‌های دیگر) مجاز هستند.” (مرجع C++ , nd, p.1)

  • انواع داده های مشتق شده از انواع داده های اولیه مشتق شده اند و عبارتند از:

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

  • نوع داده های تعریف شده توسط کاربر، همانطور که از نام می گوید توسط کاربر تعریف می شود
  1. کلاس: متغیرها و توابع را در یک واحد ذخیره می کند.
  2. ساختار (ساختار): مشابه کلاس ها اما با دسترسی پیش فرض عمومی.
  3. اتحادیه: انواع داده های مختلف را در یک مکان حافظه ذخیره می کند.
  4. شمارش (enum): مجموعه‌ای از نام‌های مرتبط با یک ثابت عدد صحیح، به‌طور گسترده در صنعت بازی‌های ویدیویی استفاده می‌شود.
  5. Typedef: اجازه ایجاد یا اختصاص نام های جدید برای انواع داده های موجود.

تفاوت های اصلی بین مدل ها: C++ در مقابل جاوا

قبل از فهرست کردن تفاوت‌های بین C++ و نوع داده جاوا، می‌خواهم تفاوت‌ها و شباهت‌های اصلی بین این دو زبان را مورد بحث قرار دهم.

هر دو زبان برنامه نویسی شی گرا (OOP) هستند. با این حال، C++ وابسته به پلتفرم است، در حالی که جاوا به دلیل مولفه ماشین مجازی جاوا (JVM) مستقل از پلتفرم است که جاوا را با استفاده از یک مفسر به بایت کد کامپایل می کند، که می تواند روی هر سیستمی با JVM اجرا شود. قابلیت Write Once, Run Anywhere” (Eck, 2015). علاوه بر این، C++ از برنامه نویسی رویه ای و شی گرا پشتیبانی می کند، در حالی که جاوا کاملاً OPP است و C++ را برای برنامه نویسی سیستم عامل ها مناسب تر می کند. علاوه بر این، جاوا که کاملاً شی گرا است، از متغیرهای سراسری یا توابع آزاد پشتیبانی نمی کند (همانطور که C++ انجام می دهد). جاوا همه چیز را در کلاس ها کپسوله می کند.

انواع داده ها تفاوت بین C++ و جاوا

در زیر لیستی از تفاوت های نوع داده بین C++ و جاوا آمده است.

  • هر دو زبان دارای انواع داده های اولیه هستند. با این حال، C++ از هر دو نوع امضا شده و بدون علامت پشتیبانی می‌کند، که باعث می‌شود انواع داده‌های اولیه C++ انعطاف‌پذیرتر شوند، اما در صورت بدون امضا، امنیت کمتری نیز دارند. انواع داده های اولیه جاوا به طور پیش فرض امضا می شوند (Eck, 2015).
  • انواع داده های اولیه جاوا اندازه های ثابتی دارند و مستقل از پلتفرم هستند، در حالی که اندازه های ذخیره سازی انواع داده های اولیه C++ وابسته به پلتفرم هستند.
  • C++ بین انواع اولیه و شیء سازگاری ایجاد می کند. جاوا همچنین بین چیزهای اولیه و اشیاء تمایز قائل می شود. با این حال، برای انواع ابتدایی مانند Integer برای int، «کلاس‌های wrapper» دارد که به آن‌ها اجازه می‌دهد رفتار شی‌مانندی داشته باشند (Sruthy, 2024).
  • جاوا از انواع داده های ساختاری یا اتحادیه پشتیبانی نمی کند، در حالی که C++ از آن پشتیبانی می کند.
  • C++ از اشاره گرها و انواع مرجع پشتیبانی می کند، در حالی که جاوا پشتیبانی بسیار محدودی دارد. این با انتخاب و به دلایل امنیتی است.
  • متغیرهای C++ دارای دامنه جهانی و همچنین دامنه فضای نام هستند. از سوی دیگر، متغیرهای جاوا دامنه جهانی ندارند. با این حال، آنها می توانند محدوده بسته را داشته باشند.
  • جاوا از نظرات مستندات “Javadocs” پشتیبانی می کند، در حالی که C++ اینطور نیست.

آسیب پذیری های احتمالی هنگام استفاده از انواع داده های C++

اگر نوع داده های C++ به درستی مدیریت نشود ممکن است مشکلات امنیتی ایجاد کند. بنابراین، درک و شناسایی آسیب‌پذیری‌های نوع داده C++ بسیار مهم است. در زیر لیستی از رایج‌ترین آسیب‌پذیری‌هایی که ممکن است با مدیریت انواع داده‌های C++ و نحوه کاهش آن‌ها ایجاد شود، آمده است.

1. سرریز بافر

سرریز بافر زمانی اتفاق می افتد که داده های نوشته شده در حافظه از ظرفیت تخصیص داده شده توسط بافر فراتر رود. این می تواند منجر به خرابی برنامه یا اجرای کد مخرب شود. برای جلوگیری از سرریز بافر، مهم است که مرزها را قبل از کدنویسی بررسی کنید و از توابع کتابخانه ای مقاوم در برابر سرریز بافر مانند “fgets” استفاده کنید. از استفاده از «scanf»، «strcpy»، «printf»، «get» و «strcaf» که مستعد سرریز شدن بافر هستند خودداری کنید (GuardRails، 2023).

نمونه کد زیر را ببینید.

#include 
#include 

int main() {
    char buffer[10];
    std::cout << "Enter a string: ";
    fgets(buffer, sizeof(buffer), stdin);  // Avoids buffer overflow by 
                                           // limiting input
    std::cout << "You entered: " << buffer << std::endl;
    return 0;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. سرریز و زیر جریان عدد صحیح

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

برای جلوگیری از سرریز و زیر جریان اعداد صحیح، همیشه مقادیر را قبل از انجام عملیات حسابی اعتبار سنجی کنید، به مثال کد زیر مراجعه کنید:

#include  
#include  // For INT_MAX  int add(int a, int b) {
    if (a > 0 && b > INT_MAX - a) {
        std::cerr << "Integer overflow detected!" << std::endl;
        return -1;  
    }
    return a + b;
}

int main() {
    int x = INT_MAX - 1;
    int y = 2;
    std::cout << "Result: " << add(x, y) << std::endl;
    return 0;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که قبل از اضافه کردن a و b، در تابع add، شرط اضافه کردن آنها باعث سرریز می شود بررسی می شود، در اینجا مجموع از حداکثر مقدار مجاز عدد صحیح بیشتر است.

3. تبدیل نوع نادرست

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

به عنوان مثال کد زیر را ببینید:

#include   

void checkLength(int len) {
    if (len < 0) {
        std::cerr << "Negative length detected!" << std::endl;
        return;
    }
    std::cout << "Length is: " << len << std::endl;
}

int main() {
    // Incorrect implicit conversion    
    unsigned int value = -5;  // unsigned int are always non-negative 
    checkLength(static_cast(value));  // Properly handle conversion
    return 0;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4. مقداردهی اولیه اشاره گر

نشانگرهای تهی یک آسیب پذیری شناخته شده هستند که می توانند منجر به خرابی برنامه و سوءاستفاده احتمالی ناخوشایند شوند. همیشه نشانگرها را برای “nullptr” قبل از عدم ارجاع آنها بررسی کنید.

برای نمونه کد زیر را ببینید.

struct list {
    void *p;
    struct list *next;
};

int f(struct list *l) {
    int max = -1;
    while (l) {
        int i = *((int*)l->p); // Cast void* to int*
        max = i > max ? i : max;
        l = l->next;
    }
    return max;
}
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توجه داشته باشید که “void” برای ذخیره یک اشاره گر عمومی در لیست پیوند شده استفاده می شود و قبل از استفاده به “int” فرستاده می شود.

به طور خلاصه، درک تفاوت بین جاوا و C++، با درک انواع داده های C++، همراه با خطرات مرتبط با آنها، برای نوشتن برنامه های ایمن بسیار مهم است. این را می توان با مدیریت دقیق انواع داده، انجام بررسی کرانه ها، اعتبارسنجی تبدیل نوع، و مدیریت ایمن نشانگرها، مانند بررسی مقادیر تهی و ارسال صحیح نشانگرهای خالی، انجام داد.


مراجع:

Adam, J. & Kell, S. (2020). بررسی تایپ فراتر از چکرزهای نوع، از طریق Slice & Run. در مجموعه مقالات یازدهمین کارگاه بین المللی ACM SIGPLAN در مورد ابزارهایی برای تجزیه و تحلیل خودکار برنامه (TAPAS 2020). انجمن ماشین های محاسباتی، 23-29. برگرفته از: https://dl-acm-org.csuglobal.idm.oclc.org/doi/10.1145/3427764.3428324

Argarwal, H. (2023, 23 سپتامبر). انواع داده های C++ GoogsforGeeks. https://www.geeksforgeeks.org/cpp-data-types/

مرجع C++ (nd). انواع بنیادی cppreference.com. https://en.cppreference.com/w/cpp/language/types/

اک، دی جی (2015). فصل 1 نمای کلی: چشم انداز ذهنی. مقدمه ای بر برنامه نویسی با استفاده از جاوا (ویرایش هفتم). CC BY-NC-SA 3.0. http://math.hws.edu/javanotes/

GuardRails، (2023، 27 آوریل). آسیب پذیری های امنیتی برتر C++ و نحوه کاهش آنها. بلوار امنیتی. https://securityboulevard.com/2023/04/the-top-c-security-vulnerabilities-and-how-to-mitigate-them/

تیم تحقیقاتی امنیتی Snyk (2022، 16 اوت). Snyk.https://snyk.io/blog/top-5-c-security-risks/

Sruthy، (2024، 7 مارس). C++ در مقابل Java: 30 تفاوت برتر بین C++ و Java با مثال. راهنمای تست نرم افزار. https://www.softwaretestinghelp.com/cpp-vs-java/


در ابتدا در Alex.omegapy در Medium منتشر شده توسط Level UP Coding در 12 اکتبر 2024 منتشر شد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا