الهام عابدی / وب مستر
یک کامپیوتر ساینتیست نه به معنای واقعی ولی چیزی که می خواهد شبیه آن شود بلکه شبیه تر! خوش آمدید
الهام عابدی کاستی های زبان ++C و ایده ها

کاستی های زبان ++C و ایده ها

c++

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

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

++C ویژگی مدیریت حافظه از طریق garbage collection یا جمع آوری زباله را دارا نیست. در واقع توسط این ویژگی، حافظه ی اشغال شده ی بدون مصرف برنامه، آزاد می شود.

زبان ++C تخصیص حافظه ی پویا را پشتیبانی نمی کند. موضوعی که مطرح است در حالت ایستا چه متغیرها استفاده شوند چه مورد استفاده قرار نگیرند در مدت زمان اجرای برنامه در حافظه باقی می مانند. اینجا نیاز به مدیریت عمر حافظه هست. اختصاص حافظه به صورت پویا حافظه را با انعطاف بیشتری مدیریت می کند. مثلا در زبان دیگری؛ این کار، با اختصاص دادن یک بلاک از حافظه در فضای heap ( فضایی که در اخت‍يار هيچ برنامه ای نيست و می تواند به صورت پويا استفاده شود)، توسط تابع کتابخانه ای موجود در آن زبان (تابع  malloc در C) صورت می گیرد. برنامه از طریق اشاره گر به این فضا دسترسی دارد تا پس از اتمام کار با حافظه، با ارسال اشاره گر به تابع free، حافظه به سیستم برگردانده شود. که زبان ++C از این نوع تابع کتابخانه ای برخوردار نیست.

از مواردی که امنیت برنامه های نوشته شده به زبان ++C را تهدید می کند:

  • مستقیما امکان دسترسی به اشاره گر نیست.
  • عدم تعریف متغیر های سراسری.

معرفی نکردن نوع داده ی ثابت.

اینکه قابل استفاده برای نرم افزار های مخصوص platform می باشد.

در این زبان، اختصاص حافظه یا عدم اختصاص حافظه به عهده ی برنامه نویسان است.

هیچ روش استانداری برای پیوند پویا (Dynamic linking) به کلاس های ++C وجود ندارد.

زبان ++C نسبت به زبان های سطح بالا از قابلیت حمل کمتری برخوردار است. در تئوری قابل حمل است چون یک زبان میانی است.

ساده نبودن کد منبع آن نسبت به دیگر زبان ها.

هر برنامه ای که به این زبان نوشته می شود از تعداد زیادی فایل تشکیل شده است که به هم الحاق می شود.

پشتیبانی نکردن از اتصال به پایگاه داده.

ایده ها برای رفع ایرادات زبان ++C

یکی از راهکار های پیدا کردن نقاط آسیب پذیر احتمالی یا همان سرریز بافر، بررسی سورس برنامه و یافتن توابع آسیب پذیر هست. توابعی مثل: gets، strcat، strcpy، getopt، vsscanf، sscanf، streadd، getpass و… . مثلا تابع strcpy ، به طول رشته ای که کپی می کند و طول بافر توجه ندارد.

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

ایده برای افزودن ویژگی های جدید زبان ++C           

ابزارهایی جایگزین ویژگی garbage collection حین برنامه نویسی با این زبان وجود دارد که می توانیم حافظه را به خوبی مدیریت کنیم.

ابزارهایی جهت بررسی و پاسخگویی به مشکلات امنیتی حاصل از زبان ++C.

استفاده از شبه ORM (Object Relational Mapper) برای پشتیبانی از پایگاه داده. در واقع ORM یک تکنیک برنامه نویسی برای ارتباط بین دیتابیس و برنامه ی شئ گرای ما می باشد.

برای قابلیت حمل در عمل باید یک زبان دیگر(#ifdef’d type,etc) در بالای برنامه بسازیم.

برای انتقال برنامه های cpp از یک معماری به معماری دیگر باید آن را مجددا روی ماشین کامپایل کرد.

افزودن ویژگی های جدید به زبان ++C

ابزارهایی برای مدیریت حافظه مانند Boehm، Demers و Weiser وجود دارند. این ابزارها به ما این امکان را می دهد که پس از حذف حافظه، به طور خودکار حافظه را بتوان مجددا بازیافت کرد.

درسته که کامپایلرهایی برای اشکال زدایی نگارشی و ایرادات منطقی این زبان وجود دارند؛ اما پاسخگوی مشکلات امنیتی و حفره های به وجود آمده در برنامه نیستند لذا ابزارهای رایگانی جهت این پاسخگویی تا حد قابل قبولی روی کار آمده اند مانند: Splint و FlawFinder .

یه سری گزینه برای انتخاب ORM وجود دارد، مثلا: odb، qxrm و soci. ویژگی هایی برای انتخاب آن مدنظر ماست مانند:

  • وابستگی زیادی نداشته باشد. مثلا وابستگی به qt
  • Open source باشد
  • از پایگاه داده هایی که بیشتر مورد استفاده هستند، حداقل پشتیبانی کند. مثل Mysql یا Sqlite .

یک دیدگاه ثبت کنید