آشنایی با تحلیل ایستای کد - Static Code Analysis

مقدمهاحتمالا تاکنون اسم ابزارهایی مثل Sonarqube یا Codacy به گوش شما خورده است. این ابزارها در دسته‌ی تحلیل ایستای کد جای می‌گیرند(Static Code Analysis). این ابزارها می‌توانند با تحلیل کدهای نوشته، به صورت خودکار بعضی از باگ‌های موجود و اشتباهات رایج را پیدا کرده و گوشزد کنند. در این مقاله به معرفی Static code analysis پرداخته و مزایا و معایب آن‌ها را بررسی می‌کنیم. همچنین چندین مثال و چندین ابزار را معرفی می‌کنیم و نحوه‌ی کارکردن و ویژگی‌های هر کی را برمی‌شمریم.معرفی Static Code Analysisافزایش کیفیت و نوشتن نرم‌افزارهای عاری از باگ همیشه آرزوی برنامه‌نویسان بوده است. برای نوشتن نرم‌افزار با کیفیت نیاز داریم تا تمامی برنامه‌نویسانی که روی مخزن کد کار می‌کنند با خوبی با امکانات و باگ‌های رایج در آن زبان آشنا باشند تا بتوانند از آن‌ها جلوگیری کنند. همچین نیاز داریم تا برنامه‌نویس‌ها با انواع مشکلات امنیتی و نحوه‌ی ایجاد آن‌ها در کد آشنا باشند. در صورتی که تمامی برنامه‌نویسان پروژه از چنین دانشی برخوردار باشند می‌توانند از باگ‌ها و مشکلات امنیتی جلوگیری کرده و احتمال تولید کد‌های باکیفیت بالاتر می‌رود.متاسفانه خیلی کم پیش می‌آید که تمام برنامه‌نویسان یک پروژه دانش بسیار کاملی از زبان برنامه نویسی، مشکلات امنیتی رایج و باگ‌های رایج داشته باشند. علاوه بر آن حتی این چنین برنامه‌نویس‌هایی نیز ممکن است اشتباه کنند و باگ‌های ساده و عجیب غریب در کد بگذارند. خیلی از برنامه‌نویس‌ها با سررسید‌(Dead line) کارفرما یا پروژه مواجه هستند و بعضی از اوقات مجبور می‌شوند تحت فشار کار کنند. حتی در شرایط عادی نیز ممکن است خطای سهوی یا بی دقتی رخ دهد. به همین دلیل امکان بروز خطاهای رایج و واضح حتی توسط برنامه‌نویس‌های باتجربه و حرفه‌ایی نیز وجود دارد.یکی از راه‌های بسیار خوب برای حل این مشکلات و افزایش کیفیت نرم‌افزار بازبینی‌کد (Code Review) است. در بازبینی‌کد، تمامی کدهای نوشته در پروژه، توسط فردی به جز نویسنده‌ی اصلی کدها بررسی شده و خطاهای احتمالی کشف می‌شود. بازبین‌کد معمولا یکی از افراد باتجربه‌ی تیم است که بر روی پروژه مسلط است. بازبین بر روی کدها نظر میدهد و نویسنده‌ی کدها در صورت لزوم اشتباهات احتمالی را اصلاح می‌کند.بررسی کدها توسط یک نفر دیگر تا حد خوبی امکان خطا را پایین می‌آور اما صفر نمی‌کند. علی‌الخصوص که چک کردن بعضی از مشکلات ممکن است حوصله سربر و زمان بر باشد. برای مثال در کدهای جاوا import کردن کلاس‌هایی که اصلا استفاده نشده است یک bad smell است و باید اصلاح شود. بررسی کردن تمامی import ها در تمامی فایل‌ها توسط بازبین‌کد کاری بسیار دشوار و سخت است. از طرفی ابزارها می‌توانند به صورت خودکار و دقیق و سریع این نوع قوانین را چک کنند و هشدار بدهند.ابزارهای تحلیل ایستای کد (Static code analysis)، با بررسی خودکار کدها می‌توانند جلوی بسیاری اشتباهات و مشکلات امنیتی را بگیرند. دلیل اینکه به این ابزارها ایستا می‌گوییم این است که این ابزارها بدون اجرای کدها و فقط با بررسی محتوای فایل‌ها، کدها را بررسی می‌کنند. در این ابزارها قوانین مختلفی تعریف می‌شود که ابزار می‌تواند آن را روی کدها بررسی کند. برای مثال قانون نداشتن import های بلا استفاده. یا قانون جلوگیری از حمله SQL injection و ... . هر ابزار صدها بلکه هزاران قانون مختلف به صورت پیش‌فرض برای هر زبان دارد که بسیار کاربردی است و می‌تواند جلوی بسیاری از مشکلات را بگیرد.مزیت دیگر این ابزارها این است که قوانین خود را به صورت مرتب بروزرسانی می‌کنند و یا بهبود می‌دهند. معمولا پشت هر ابزار، تیمی از برنامه‌نویسان باتجربه قراردارند که کارشان بهبود و تعریف قانون جدید برای این ابزارهاست. همین باعث می‌شود که ما با بروزرسانی ابزار تحلیل خود و با هزینه‌ی بسیار پایین از قوانین جدید بهره ببریم و بتوانیم کدهای بهتری تولید کنیم.در این ابزارها این امکان وجود دارد که قوانین شخصی سازی بشوند و تا احد امکان با نیاز تیم ما و استانداردهای ما سازگار بشوند. همچنین می‌توان به سادگی برای این ابزارها افزونه نوشت و قوانین جدید به آن‌ها اضافه کرد. این قابلیت کمک می‌کند تا بتوانیم بسازی از چک‌های روتین را خودکار کنیم و فرایند توسعه را سریع کنیم.یکی از قابلیت‌های بسیار کاربردی این ابزارها وجود Quality Gate برای کدهاست. بدین صورت که شما می‌توانید حداقل‌های لازم برای کدهای پروژه را مشخص کنید و این ابزارها به صورت خودکار ان حداقل‌ها را چک کنند. برای مثال فرض کنید در پروژه میخواهیم جلوی ثبت شدن کدهایی که حداقل 70 درصد پوشش خط در تست‌ها ندارند را بگیریم. در این صورت به راحتی می‌توانیم در ابزار تحلیل کد Quality Gate تعریف کنیم تا اگر کدی با این شرایط وجود داشت خطا بدهد.از مزیت دیگر این ابزارها سازگاری بسیار خوب آن‌ها با سیستم‌های CI/CD است. به راحتی در چرخه‌ی اجرای پروژه می‌توانیم این تحلیل‌ها را اجرا کنیم و به برنامه‌نویس فیدبک بدهیم. در این صورت تا زمانی که بر روی تمامی کدها Quality Gate برقرار نشود، کدی نمی‌تواند ثبت شود و بدین گونه کیفیت نرم‌افزار را تضمین کرده و بالاتر می‌بریم.همچنین این ابزارها فرایند بازیبنی‌کد را نیز بسیار کاراتر و سریع‌تر می‌کنند. بسیاری از قوانینی که قبلا لازم بود توسط بازبین کد به صورت دستی چک بشود اکنون قابلیت خودکارسازی دارد و بازبین کد می‌تواند تمرکز خود را بر روی قسمتم‌های بیزینسی و مهم کد بگذارد. از طرفی خیال بازبین راحت است که ابزار تحلیل کدها، به صورت سریع و خودکار تمامی خطاهای موجود را پیدا می‌کند و دیگر نیازی به بررسی دستی نیست.از طرفی وجود این ابزارها فرایند بازخورد به برنامه‌نویس را بسیار سریع‌تر می‌کند. برنامه نویس می‌تواند بلافاصله بعد از اتمام کد زدن یا حتی در حین کد زدن از سیستم static analysis بازخورد دریافت کند و دیگر لازم نیست چندین ساعت منتظر بازبینی کد توسط فرد دیگری بماند که این خود فرایند بازبینی را بسیار تسریع می‌کند.این ابزارها برای برنامه‌نویس‌های کم تجربه تر نیز از این جهت خوب است که باعث یادگیری آن‌ها می‌شود. ابزارهای Static analysis معمولا برای باگ‌های رایج یا مشکلات امنیتی توضیحات بسیار کاملی دارند که برای برنامه‌نویس‌های تازه‌کار می‌تواند یادگیری خوبی با هزینه کم داشته باشد.یکی از معایب ابزارهای Static analysis وجود خطاهای False positive است. این نوع خطاها، خطاهایی هستند که سیستم های static analysis به اشتباه از کد کشف کرده و گزارش می‌دهند. برای مثال اگر کدی پیچده یا تودرتو شود ممکن است ابزار تحلیل کد گیج شده و خطاهای اشتباهی را گزارش کند. همچنین هرچقدر ابزارها امکانات پیشرفته‌تری را ارائه می‌کنند امکان اشتباه نیز بیشتر است. برای مثال ابزاری که سع می‌کند خطاهای کدهای همروند را کشف کند احتمال اینکه FP داشته باشد خیلی بیشتر است.این نوع خطاها گاه می‌توانند بسیار اذیت کننده شوند اما معمولا ابزارهای مختلف برای این نوع خطاها نیز چاره‌ اندیشیده‌اند. معمولا شما می‌توانید بعضی از خطاها را silent کنید یا به عنوان won’t fix نشان کنید. یا اینکخه برای بخشی از کد یک خطا را غیرفعال کنید تا FP تولید نشود.ابزارهای معروف این حوزهسونارکیوب(SonarQube)سونارکیوب یکی از قدیمی‌ترین و معروف‌ترین ابزارهای این حوزه است. هسته‌ی اصلی سونارکیوب کاملا متن‌باز و قابل دسترس است و اکثر امکانات لازم را دارا است اما نسخه‌های پولی نیز دارد که امکانات بیشتری دارند. نسخه‌های پولی امکاناتی مثل تحلیل جریان داده(Flow analysis)، تحلیل‌های پیشرفته‌ی امنیتی و گزارش‌های بیشتری را اضافه بر نسخه‌ی رایگان دارند.سونارکیوب به طور کلی از دو بخش سرور و کلاینت تشکیل شده است. سمت سرور یک Web Apploication است که وظیفه‌ی نگهداری اطلاعات کدها و تاریخچه‌ی اسکن‌های مختلف را دارد. همچنین وظیفه‌ی نشان دادن این اطلاعات از طریق UI با سرور است. سمت کلاینت از طریق maven یا gradle در pipeline اجرا شده و کدها را اسکن می‌کند و نتایج را به سرور سونارکیوب می‌فرستد.همچنین در سونارکیوب می‌توانید بر روی پروژه‌های مختلف Quality Gate تعریف کنید و اگر این شرط‌ها برقرار نباشد Gate پروژه شما fail می‌شود. بر اساس گیت پایپلاین را نیز می‌توانید fail کنید و مانع از ثبت شدن کدها بشوید. سونارکیوب مفهوم Branch و Pull-Request را به خوبی میفهمد و می‌تواند به ابزارهایی مثل گیت‌هاب و گریت متصل شود که از این جهت نیز کار شما را بسیار ساده می‌کند.همچنین سونارکیوب انواع زبان‌های مختلف از VB گرفته تا TypeScript را متوجه می‌شود و حتی پروژه‌های ترکیبی را نیز می‌تواند اسکن کند که این نقطه‌ی قوت است.سونارکلود(SonarCloud)سونارکلود نسخه‌ی ابری سونارکیوب است که به صورت رایگان به شما سرویس می‌دهد. فقط کافی است که از سمت کلاینت شما کدهای خود را اسکن کنید تا سونارکلود نتایج را به شما نشان دهد و تحلیل‌های مختلفی را ارائه دهد. همچنین سونارکلود به صورت خودکار می‌تواند به گیتهاب و گتلب وصل شده و روی پول ریکوئست های مختلف کامنت بدهد یا کامنت های قدیمی را حذف کند.مزیت استفاده از سونارکلود این است که به صورت سرویس ارائه می‌شود و هزینه‌ی نگهداری یا نصب برای تیم استفاده کننده ندارد. از طرفی به صورت خودکار بروزرسانی می‌شود و بعضی قابلیت های نسخه‌ی پولی سونارکیوب نیز در سونارکلود فعال است. یکی از عیب های سونارکلود این است که اطلاعات کدهای شما از جمله سورس‌کدها به سرورهای سونارکلود ارسال می‌شوند و اگر پروژه‌ی شما خصوصی باشد یا به هردلیلی قابلیت انتشار نداشته باشد، احتمالا نمی‌خواهید از یک سرویس دهنده‌ی عمومی استفاده کنید و ریسک کنید و به همین علت باید یک سرور داخلی سونارکیوب نصب کنید.کداسی(Codacy)کداسی نیز ابزاری است که تحلیل ایستای کد را به صورت سرویس ارائه می‌دهد. این سرویس نسبت به سونارکیوب جدیدتر ارائه شده و بین برنامه‌نویسان کمتر شناخته‌ شده است. این ابزار برای کدهای اوپن سورس رایگان است اما قابلیت نصب on-premise به صورت رایگان را ندارد.کداسی یکی از مزیت های خود را UI کامل و بهتر می‌داند. در کداسی شما به معیارهای مختلف و بسیاری از کدهای خود دسترسی دارید و همچنین روند این معیارها از طریق نمودارهای مختلفی به شما نشان داده می‌شود. همچنین کداسی همانند سونارکیوب می‌تواند کدها را از نظر امنیتی نیز تحلیل کند و گزارش‌های خوبی را ارائه دهد.باتوجه به اینکه این ابزار عمر کمتری نسبت به سونارکیوب دارد تعداد مقالات و community پشت آن نیز کمتر است.شرکت‌های ایرانی ارائه دهنده‌ی این خدماتhttps://www.mohandespishegan.com/tools/code-analysis/sonarشرکت مهندس پیشگان یکی از شرکت‌های ایرانی است که در زمینه ارائه خدمات مربوط به آزمون نرم‌افزار و تحلیل ایستای کد فعالیت می‌کند. یکی از ابزارهای ارائه شده توسط این شرکت ابزار سونارکیوب می‌باشد. این شرکت همچنین ابزارهای دیگری برای تحلیل ایستای کد مثل JTest و dotTest را نیز ارائه می‌کند.شرکت کوالاتک نیز شرکتی دانش بنیان است که در زمینه آزمون نرم افزار و تضمین کیفیت نرم‌افزار فعالیت می‌کند. این شرکت نیز در زمینه راه اندازی ابزار تحلیل ایستا و افزایش کیفیت نرم‌افزار مشاوره می‌دهد. همچنین این شرکت در زمینه هماهنگ سازی CI با ابزار تحلیل ایستا و خودکار سازی این فرایند نیز فعالیت می‌کند که حائز اهمیت است.https://qualatech.ir/source-code-analysis/جمع بندیدر این مقاله به معرفی تحلیل ایستای کد پرداختیم و بعضی از ابزارهای معروف در این حوزه را نیز بررسی کردیم. به اینکه چرا باید از این ابزارها استفاده کنیم اشاره کردیم و برخی از مزیت‌های آن‌ها را برشمردیم. در نهایت دو شرکت ایرانی که در این حوزه فعالیت می‌کردند را معرفی کردیم.این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی استمنابع:https://www.codacy.com/products/sonarqube-alternativeshttps://sdtimes.com/test/5-ways-static-code-analysis-can-save-you/https://en.fasoo.com/top-10-reasons-why-you-should-use-static-code-analysis/https://www.appknox.com/blog/static-code-analysishttps://docs.sonarqube.org/latest/