هانیه محمدی ارزنق
هانیه محمدی ارزنق
خواندن ۱۰ دقیقه·۳ سال پیش

تحلیل کد استاتیک چیست؟

مقدمه

به عنوان یک دولوپر احتمالا تمام طول عمر کاری و یا بخشی از ان را به عنوان عضوی از یک شرکت یا یک گروه در حال توسعه‌ی نرم افزار‌های مختلف هستیم.یکی از کارهایی که که وظیفه‌ی روزانه‌ی ما به عنوان یک دولوپر به خصوص اگر یک دولوپر خبره باشیم هست،بازبینی کد‌های افراد مختلف است.هنگم بازبینی به دنبال موارد مختلفی هستیم از جمله یکسان بودن دست خط افراد مختلفی که بر روی پروژه کار می کنند،پیدا کردن آسیب پذیری‌های امنیتی که ممکن است به خاطر کد به وحود بیاید،دنبال کردن best practice های موجود هر زبان برنامه نویسی در کد‌ها،پیدا کردن باگ‌ها و ...
زمانی که پروژه هنوز خیلی بزرگ نشده و افراد زیادی بر روی پروژه به شکل هم زمان کار نمی‌کنند احتمالا انجام دادن بازبینی کد کار طاقت فرسایی نباشد هر چند که احتمال این که مواردی هم از زیر دستمان در برود به خاطر خطا‌های انسانی همیشه وجود دارد.با بزرگ شدن پروژه و تیم، افراد بیشتری برای انجام وظیفه‌ی بازبینی کد نیاز خواهد بود و احتمالا انجام این وظیفه زمان زیادی را از نیروهای خبره میگیرد،به خصوص اگر تعدادی نیروی تازه کار به تیم اضافه شده باشند که با خیلی از best practice ها آشنا نیستند و احتمال وجود داشتن باگ در کدهایشان بالاست.
همچنین زمان‌هایی وجود دارد که تیم‌های نرم افزاری تحت فشار کاری بالا برای رساندن پروژه‌ها پیش از ددلاین هستند،در این مواقع تمامی افراد تیم به خصوص نیروهای خبره در حال پیاده‌سازی بخشی از پروژه هستند و زمان زیادی برای بازبینی کد باقی نمی‌ماند.
راه حلی که به ذهن خطور می‌کند خودکار کردن این بازبینی است.تا به حال بخش‌های مختلفی از فرآیند توسعه‌ی نرم افزار خودکار شده‌اند مانند Continuous Delivery/Continuous Integration و توسعه دهندگان نفع‌های زیادی از آن دریافت کرده‌اند.برای بازبینی کد هم چنین تمهیداتی اندیشیده شده و ابزار‌های بسیاری معرفی شده‌اند که بخش زیادی از بازبینی کد را با توجه به تنظیماتی که برای آن‌ها تعیین می‌شود،انجام می‌دهند.


معرفی

یک تعریف ساده از تحلیل کد استاتیک این است که تمام کد ما برای پیدا کردن باگ،آسیب پذیری‌های امنیتی،دست خط یکسان و... بررسی می شود.
تحلیل کد استاتیک پیش از آن که نرم افزار وارد فاز اجرای تست‌های خودکار و دستی بشود،بدون کامپایل کردن کد،تمام کد منبع را بررسی می‌کند و گزارشی از ضعف‌هایی که امکان تبدیل شدن به آسیب پذیری را در آینده دارند به دولوپر‌ها ارائه می‌دهد.البته این وظیفه را می‌توان بدون وجود ابزار نیز انجام داد و هر یک از افراد تیم وظیفه‌ی بازبینی کد را به عهده داشته باشند که همانطور که پیش از این ذکر شد،وجود خطاهای انسانی باعث کاهش تاثیر گذاری این کار می‌شود.
خیلی از باگ‌ها و آسیب پذیری‌های امنیتی که منبع کد نشات می‌گیرند ممکن است حتی تا مدت‌ها پس از استقرار نرم افزار ظاهر نشوند و کاربر هم متوجه حضور آن‌ها نشود؛اما این امکان وجود دارد زمانی این آسیب پذیری‌ها مشخص شوند که ضرر‌های مالی سنگینی به پروژه وارد شود و با توجه به این که نرم افزار استقرار پیدا کرده‌است،رفع آن نیز هزینه بر باشد.تشخیص زود هنگام مشکلات در فرآیند توسعه‌ی نرم افزار جزو موارد ضروری برای کاهش هزینه‌ی نگه داری آن است.تحلیل کد استاتیک قادر است آسیب پذیری‌ها را در عمیق ترین لایه‌های کد و قسمت‌های مراقبت نشده نیز شناسایی کند. جالب است بدانید که ۸۲٪ از آسیب پذیری‌های امنیتی ناشی از باگ‌ها و مشکلاتی است که در کد منبع وجود دارد.
هنگام استفاده از ابزار‌های تحلیل کد استاتیک علاوه بر این‌که می‌توانید از یکی از دستورالعمل‌های راهنمای نوشتن کد با توجه به زبان برنامه نویسی مورد استفاده بهره مند شوید،می‌توانید قوانی مورد نظر خودتان که در شرکت یا تیم‌تان باید هنگام کد زدن رعایت شود به تنظیمات آن اضافه کنید.هر جه این قوانیی با دقت بیشتری به ابزار مورد نظرتان اضافه شود،کد یک دست‌تر و با کیفیت خیلی بالاتری خواهید داشت.

در چه مرحله‌ای از توسعه‌ی نرم افزار باید از تحلیل کد استاتیک استفاده کرد؟

تحلیل کد را می‌توان در هر مرحله‌ای از فرآيند توسعه اجرا کرد اما بهترین زمان آن پیش از فاز تست و در واقع در همان فاز تولید نرم افزار وکد زنی است.در این مرحله دولوپر‌ها خیلی زود از مشکلات موجود در کد‌هایش آگاه می‌شوند و پیش از آن که به مرحله‌ی تست خود کار برسند،آن را رفع می کنند.علاوه بر این در فاز تست ،نرم افزار به حالت اجرا در می‌آید و هدفی که در این فاز وجود دارد تست کردن functionality و کارکرد نرم افزار است و درگیر کد نرم افزار و بررسی آن جهت رعایت کردن دستورالعمل‌های کد گذاری مانند MISRA و رعایت Convention ها و Best Practice ها بررسی آسیب پذیری‌های کد نمی‌شود.

محدودیت‌های تحلیل کد استاتیک چیست؟

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

مواردی که تحلیل کد استاتیک نمی‌تواند پوشش دهد:

  • درکی از منظور و هدف توسعه دهنده نداشته باشد:
    int calculateArea(int length, int width){
    return(length + width)
    }
    ابزار تحلیل کد استاتیک احتمالا می‌تواند متوجه وجود سرریز در کد بالا شود اما هیچقوت نخواهد فهمید که منطق کد بالا چیزی نیست که توسعه دهنده انتظار داشته با آن به جواب برسد.
  • قوانینی که قابلیت اجرا به صورت استاتیک را ندارند:
    بعضی از قوانین کد زنی وابسته به اسناد خارجی هستند و یا این که با توجه به موضوع می‌توان تفاسیر مختلفی از آن‌ها کرد.برای مثال یکی از قوانین کد زنی CERT این است که: از کامنت‌ها به صورت یکپارچه به صورتی که خوانا باشند استفاده کنید.که برداشت‌های متفاوتی از یکپارچه و خوانا بودن ومی‌توان داشت و بنابراین برای ابزار غیر ممکن است که این قانون را در سطح کد بررسی کند.
  • نقص‌های موجود در برنامه ممکن است منجر به مثبت کاذب(تشخیص وجود مشکل در حالی که مشکلی وجود ندارد) یا منفی کاذب(عدم تشخیص مشکلی که وجود دارد) شود:
    در برخی موارد،ابزار فقط می‌تواند گزارشی درباره‌ی وجود یک نقص ارائه کند:
    int divide(void){
    int x;
    if(foo()){
    x=0;}
    else{
    x=5}
    return(10/x);
    }
    از آنجایی که مقدار x وابسته به تابع foo() است،در صورتی چیزی درباره‌ی این تابع ندانیم،مقدار x را هم نخواهیم دانست.نتیجه غیر قابل تشخیص خواهد بود وبنابراین ممکن است ابزار خطایی را گزارش کند که در واقع وجود ندارد و یا در گزارش خطاهای واقعی دچار مشکل شوند(منفی کاذب)

مزایای استفاده از ابزار‌های تحلیل کد استاتیک چیست؟

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

سرعت

بازبینی کد به صورت دستی زمان زیادی را از دولوپر‌ها میگیرد.ابزار‌های خودکار بسیار سریع‌تر هستند.
ابزار‌های تحلیل کد استاتیک،مشکلات را خیلی زود در فرآیند توسعه‌ی نرم‌افزار متوجه می‌شوند و آدرس دقیق مکان وجود مشکل را به ما گزارش می‌کنند،بنابراین قادر خواهیم بود که مشکلات را خیلی سریع‌تر رفع کنیم.همچنین هزینه‌ی رفع این مشکلات به دلیل تشخیص زود هنگام آن‌ها کاهش چشم گیری خواهد داشت.

عمق

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

دقت

بازبینی کد‌ها به صورت دستی به دلیل خطای انسانی می‌تواند بستری برای اشتباهات باشد در حالی که ابزار‌های خودکار خطای دقت و انسانی نخواهند داشت و هرچه قوانین دقیق برای آن‌ها تعریف شود نتایج بهتری را بر‌می گردانند.ابزار‌ها خط به خط کد منبع را برای پیدا کردن مشکلات احتمالی چک می کنند.بنابراین می‌توانیم از بالاترین کیفیت برای کدمان پیش از ورود به فاز تست اطمینان پیدا کنیم.

علاوه بر موارد گفته شده می‌توان به این مزیت اشاره کرد که با استفاده از این ابزار‌ها،نیروهای تازه کار هر تیم به مرور زمان بدون نیاز داشتن به کلاسی با best pracice های زبانی که به آن برنامه نویسی می‌کنند آشنا می‌شوند و بنابراین با گذشت زمان کد‌هایی با کیفیت بالاتر ارائه خواهند کرد و مسیر خبرگی را سریع تر طی خواهند کرد و هزینه‌ی کمتری را به دلیل خودآموز بود این فرایند برای آموزش خواهند داشت.

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

از آنجایی که وجود چنین ابزاری برای توسعه‌ی نرم‌افزار مهم و ضروری است،احتمالا تمامی شرکت‌ها و استارتاپ‌ها به دنبال داشتن این ابزار هستند اما شاید ابزار‌هایی که تچاری هستند و نیاز به پرداخت پول دارند برای بعضی به صرفه نباشد بنابراین به به دنبال ابزار‌های متن باز این حوزه هستند.

Visual Code Grepper:

یک ابزار تحلیل استاتیک کد بسیار سریع و قدرتمند برای زبان‌های برنامه نویسی رایج و محبوب مانند C ، C++ ، C# ، VB ، PHP ، Java ، PL/SQL و COBOL است.Visual Code Grepper به شکل موثری سرعت بازبینی کد را با شناسایی کد‌های نا‌امن بالا می‌برد.به دنبال اصطلاحاتی در کامنت‌ها می‌گردد که اشاره بر یک کد نا میزان داشته باشد.همچنین گزارش‌های دقیقی را ابا ارائه کردن آمار و نمودار‌های دایره‌ای به دست استفاده‌کنندگان می‌رساند. ویژگی‌های خیلی خوبی را برای کسانی که می‌خواهند از تحلیل کد استاتیک استفاده کنند و زمان برایشان ارزشمند است،فراهم می‌کند.

  • با استفاده از این ابزار می‌توان برنامه‌های نوشته شده به بیشتر زبان‌های برنامه نویسی(چه جدید چه قدیمی) را آنالیز کرد.فقط کافیست زبانی که از آن استفاده می‌کنیم را مشخص کنیم تا این ابزار به خوبی آن را شناسایی کند و کد ما را آنالیز کند.
  • با استفاده از یک نمودار دایره‌ای تحلیل و آنالیز کاملی را از تمام کدمان به ما ارائه می‌دهد که بخش‌های مربوط هر یک از مشکلات را در آن مشخص می‌کند.
  • علاوه بر بررسی‌های پیچیده‌ی متعددی که خود ابزار انجام می دهد این امکان را به ما می‌دهد که از طریق افزودن فایل کانفیگ به ابزار بگوییم به دنبال چه موارد دیگری باشد.

‌Bandit:

یک ابزار رایگان برای پیدا کردن مشکلات امنیتی در کد‌های نوشته شده به زبان Python است.هر فایل را با پلاگین مناسبی بررسی می‌کند و گزارش دقیقی از مشکلات امنیتی ممکن در کد ارائه می‌کند.یک نرم افزار متن باز با لیسانس Apache 2.0 است که می‌تواند در فاز پیاده سازی یا پس از آن برای پیدا کردن مشکلات امنیتی رایج در پایتون پیش از استقرار و اجرایی شدن نرم‌افزار استفاده شود.از ویژگی‌های آن می‌توان به موارد زیر اشاره کرد:

  • دارای رابط خط فرمان(Command-line) برای اسکن کد پایتون
  • از فایل‌های CSV، HTML و یJSON پشتیبانی می‌کند
  • می‌توان مسیری برای گزارش پایه ایجاد کرد تا مواردی به عنوان آسیب پیری شناخته می‌شوند اما در پروژه‌ی فعلی آسیب پذیری نیستند مشخص کرد تا از آن‌ها چشم پوشی کند.

شرکت‌های ایرانی فعال در این حوزه

شرکت داده کاوان تصمیم یار

این شرکت در زمینه ارائه ، مشاوره و آموزش خدمات نرم افزاری به سازمان‌های دولتی و خصوصی فعالیت می‌نماید. شرکت داده کاوان تصمیم یار خدمات مختلف نرم افزاری ارائه می‌دهد که یکی از آنها “کوالاتک” نام دارد که “تست اتوماتیک نرم افزار و تضمین کیفیت” می‌باشد.
تیم کوالاتک متشکل از کارشناسان ارشد دانشگاه صنعتی شریف است که کیفیت دغدغه آن‌هاست.این مجموعه به سازمان‌ها و تیم‌های توسعه نرم‌افزار کمک می‌کند تا از مزایای تست و تضمین کیفیت بهره مند شوند. در همین راستا از سال ۹۶، خدمات مشاوره،‌ آموزش و برون‌سپاری تست، تضمین کیفیت و اتوماتیک‌سازی را ارائه می دهد. مهندسین QA و Test مجموعه کوالاتک به شما کمک مي‌کنند تا به طور سیستماتیک و مطابق نیازمندی شما، از ریسک‌های کیفی و هزینه‌های اضافی ناشی از عدم تست اصولی در مرحله توسعه و تولید جلوگیری کنید.

این شرکت به دلیل ارتباط مداوم با محافل علمی نظیر دانشگاه‌ها و پژوهشکده‌های تراز اول کشور به خصوص دانشگاه صنعتی شریف، سبب ارائه سطح بالایی از دانش روز دنیا به مشتریان شده است.همچنین انتقال دانش نیز یکی ازدغدغه‌های این مجموعه است و علاوه بر آموزش‌های مرسوم استفاده از خدمات نرم افزاری ، آموزش و منتورینگ دانش اصلی طراحی و پیاده سازی خدمات نرم افزاری را به مشتریان ارائه می‌کنند

خانه تست ایران

خانه تست ایران با هدف ارتقای دانش تست نرم افزار و بهبود کیفیت نرم افزار ها اعم از وب سایت ها، اپلیکیشن های اندروید (Android) ، آی او اس (IOS) و نرم افزار های دسکتاپ پا به عرصه گذاشته اشت. خدمات ما شامل مشاوره در زمینه های تست عملکردی (Functional testing) و غیر عملکردی (Non-functional testing)، تشکیل تیم تست نرم افزار و بهبود فرآیند تست نرم افزار می باشد. همچنین انجام تست اتوماتیک توسط نرم افزارهای متن باز و تجاری از جمله خدمات این مجموعه می باشد. از دیگر خدمات این مجموعه می توان به انجام تست های کارکردی (Performance) و قابلیت استفاده (Usability testing) اشاره کرد.

«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»

منابع

https://www.perforce.com/blog/sca/what-static-analysis

https://www.perforce.com/blog/qac/how-static-code-analysis-works

https://www.geeksforgeeks.org/top-5-open-source-source-and-free-static-code-analysis-tools-in-2020/

معماری_نرم_افزار_بهشتیتحلیل کد استاتیک
شاید از این پست‌ها خوشتان بیاید