‫ برنامه نويسي امن با زبان C – ورودي / خروجي (IO) – قسمت دوم

IRCAR201101086
 
 
عنصر اصلي در برنامه‌نويسي امن با زبان‌هاي مختلف برنامه‌نويسي، مستندسازي خوب و استفاده از استانداردهاي قابل اجرا است. استانداردهاي كدنويسي، برنامه نويسان را ترغيب به پيروي از مجموعه‌اي متحدالشكل از قوانين و راهنمايي‌ها مي‌كند كه بر اساس نيازمندي‌هاي پروژه و سازمان تعيين شده است، نه بر اساس سلايق و مهارت‌هاي مختلف برنامه‌نويسان. به محض تعيين استانداردهاي مذكور، مي توان از آن به عنوان معياري براي ارزيابي كدهاي منبع، چه به صورت دستي و چه به صورت اتوماتيك استفاده كرد.
از استانداردهاي معروف در اين زمينه مي‌توان به استانداردCERT براي كدنويسي امن اشاره كرد كه يك سري از قوانين و پيشنهادات را براي كدنويسي امن با زبان‌هاي برنامه‌نويسي C، C++ و جاوا ارائه مي‌دهد. هدف از اين قوانين و پيشنهادات، حذف عادت‌هاي كدنويسي ناامن و رفتارهاي تعريف نشده است كه منجر به آسيب‌پذيري‌هاي قابل سوءاستفاده مي‌شود. به كارگيري استانداردهاي مذكور منجر به توليد سيستم‌هاي با كيفيت بالاتر مي‌شود كه در برابر حملات بالقوه، پايدارتر و مقاوم‌تر هستند.
در مقاله "آشنايي با استاندارد CERT براي برنامه‌نويسي امن"، كليات استاندارد CERT در زمينه مزبور را توضيح داديم و در سري مقاله‌هاي برنامه‌نويسي امن به زبان C به صورت تخصصي‌تر شيوه برنامه‌نويسي امن با اين زبان را مورد بررسي قرار مي‌دهيم. قابل ذكر است كه در اين استاندارد 89 قانون و 134 پيشنهاد براي برنامه‌نويسي امن با زبان C ارائه شده است كه در اين سري مقالات، مهمترين آنها را كه در سطح يك قرار دارند، شرح خواهيم داد. براي كسب اطلاعات بيشتر در مورد سطح‌بندي قوانين و پيشنهادات به مقاله "آشنايي با استاندارد CERT براي برنامه نويسي امن" مراجعه فرماييد. در مقاله حاضر به ادامه پيشنهادات و قوانين ارائه شده سطح اول در مورد ورودي - خروجي خواهيم پرداخت.
 
32. FIO33-C –خطاهاي ورودي – خروجي را كه منجر به رفتارهاي نامشخص مي شوند، شناسايي كرده و آنها را برطرف سازيد.
 
شناسايي و مديريت خطاهاي ورودي – خروجي موضوع پيشنهاد FIO04 است كه در اينجا مختصراً آن را شرح مي دهيم. توابع ورودي – خروجي كه در بخش 7.19 از C99 توضيح داده شده اند، داراي تعريف دقيقي از شكست و موفقيت تابع هستند. شكست در شناسايي خطاهاي ورودي – خروجي در زيرشاخه هاي شرطي و ديگر قسمت هاي برنامه منجر به رفتارهاي نامشخص و غير قابل انتظار برنامه مي شود. بنابراين، نتايج برگشتي همه توابع ورودي – خروجي برنامه بايد مورد بررسي قرار گيرد و خطاها بايد به درستي مديريت شوند.
جدول زير مقادير برگشتي توابع ورودي –خروجي استاندارد را در صورت موفقيت و يا عدم موفقيت تابع نشان مي دهد. مي توانيد با استفاده از اين جدول مقادير برگشتي از توابع ورودي – خروجي را بررسي كرده و بروز خطا را تشخيص دهيد. همچنين مي توانيد در برخي از موارد از توابع گفته شده در ستون خطا (ferror  و  feof) نيز استفاده كنيد.

    

1. by calling ferror
2. by calling ferror and feof
در زير مثالي را مي بينيد كه در آن از تابع fopen() براي باز كردن فايلي به نام file_name استفاده مي شود. در صورتي كه تابع به هر دليلي نتواند فايل مذكور را باز كند، مقدار برگشتي null خواهد بود. اين در حالي است كه از fptr دوباره در تابع fclose() استفاده مي شود كه در صورت null بودن آن، ممكن است برنامه از كار افتاده و يا منجر به رفتار ناخواسته اي در برنامه شود.
 
 
 
براي اصلاح كد مذكور كافي است كه مقدار برگشتي از تابع Fopen() را بررسي كرده و در صورتي كه null نباشد آن را براي ديگر توابع از جمله fclose() ارسال كنيم.
 
33. FIO34-C – از متغير int براي گرفتن مقدار بازگشتي توابع ورودي – خروجي كاراكتري استفاده كنيد.
 
همه توابع ورودي – خروجي كاراكتري fgetc()، getc() و getchar() يك كاراكتر را از روي يك جريان خوانده و آن را به عنوان int برمي گردانند. در صورتي كه به انتهاي فايل برسند، نمايش دهنده انتهاي فايل جريان تنظيم شده و تابع EOF را بر مي گرداند. همچنين در صورت بروز خطا نيز مقدار EOF بازگردانده مي شود. توابع fputc()، putc()، putchar() و ungetc() نيز يك كاراكتر و يا EOF را باز مي گردانند.
در صورتي كه قرار است مقدار بازگشتي از توابع مذكور با EOF مقايسه شود، آن را تبديل به char نكنيد. به محض اينكه مقادير بازگشتي از اين توابع تبديل به char شوند، ديگر قابل تشخيص از EOF نيستند.
در زير قطعه كدي را مي بينيد كه از اين قانون پيروي نكرده است زيرا متغير c به عنوان يك char و نه يك int تعريف شده است. فرض كنيد كه يك char يك مقدار 8 بيتي علامت دار است و int يك مقدار 32 بيتي است. در صورتي كه تابع getchar()، كاراكتر 0xFF (معادل 255 دهدهي) را برگرداند، در اين برنامه نا امن در زمان مقايسه به عنوان EOF (0xFFFFFFFF) تفسير خواهد شد.
 
 
در زير برنامه اصلاح شده مذكور را مي بينيد كه در آن c به عنوان يك int تعريف شده است و همچنين از تابع feof() براي شناسايي انتهاي فايل و از تابع ferror() براي بررسي بروز خطا استفاده شده است.
 
 
در مقاله بعدي آخرين سري قوانين مربوط به ورودي – خروجي را شرح خواهيم داد.
 
مقالات مرتبط:
 

نظرات

بدون نظر
شما برای نظر دادن باید وارد شوید

نوشته

 
تاریخ ایجاد: 18 مرداد 1393

دسته‌ها

امتیاز

امتیاز شما
تعداد امتیازها:0