آشنایی با ابزارهای تحلیل کُد استاتیک

هنگام ساخت یک نرم‌افزار، تیم توسعه همواره درنظر دارد که سرعت توسعه بالا برود و همچنین برنامۀ تولید شده از قابلیت اطمینان بالایی برخوردار باشد. برای دستیابی به چنین اهدافی، تست کردن نرم‌افزار ضروریست زیرا تنها با تست کردن است که می‌توان ایرادات برنامه را پیدا کرده و سپس برای برطرف کردن آن‌ها تلاش نمود. برای تست کردن یک نرم‌افزار، روش‌های مختلفی وجود دارند که بهترین آن‌ها تست دستی انتها به انتها و تست خودکار هستند.در روش دستی، مسیرهای متعددی که یک کاربر می‌تواند از آن عبور نماید را به‌عنوان مورد تست درنظر گرفته و سپس برای یافتن خطاها اقدام می‌نماییم. مشخصاً تنظیم کردن موارد تست و نتایج بدست آمده از آن‌ها در اکثر مواقع خسته کننده است و این مسئله باعث کاهش سرعت توسعه می‌شود. در مقابل روش تست خودکار نیز همان رویکرد دستی را به کمک روش‌های خاصی به کامپیوتر سپرده و باعث افزایش سرعت کامپیوتر می‌شود. اما مشکل هزینه و محدودیت‌های خودکارسازی همچنان به قوت خود باقی خواهند ماند.اما روش‌های بهتری هم وجود دارد. در چرخۀ توسعۀ هر محصول نرم‌افزاری، تحلیل کُد استاتیک تست کردن را آسان‌تر می کند. البته نمی‌توان آن را به‌عنوان جایگزینی برای ابزارهای تست انتها به انتها دانست، ولی یک ویژگی بسیار بارِزشان این است که حتی بدون استفاده از آزمایش‌های واقعی، تا حدودی می‌توانند قابلیت اطمینان را بالا ببرند.در این پست قصد داریم تا شما را با روش تحلیل کد استاتیک و ابزارهای متن‌باز مرتبط با آن آشنا کنیم و در نهایت دو شرکت ایرانی که در این زمینه خدمات ارائه می‌دهند را معرفی نماییم.تحلیل کُد استاتیک چیست؟قبل از اینکه وارد این مبحث شویم، اجازه دهید که یک مسئله را روشن کنیم: تحلیل کُد استاتیک (Static Code Analysis) برخلاف روش‌های تست دستی یا اتوماتیک، قبل از ساخت برنامه انجام می‌شود. یعنی تحلیل کُد استاتیک به ما امکان می‌دهد تا باگ‌های احتمالی، کُدهای مشکوک و آسیب‌پذیری‌های امنیتی را حتی قبل از اینکه کُد وارد محیط تولید شود، شناسایی کنیم.به کمک تحلیل کُد استاتیک در واقع سعی داریم تا یک تست جعبه سفید انجام دهیم که در آن بدون توجه به خروجی‌های مورد انتظار، اقدام به بررسی منبع کُد نموده و ایرادات و خطاها را آشکار می‌سازیم. حالا که با این مباحث آشنا شدیم، می‌توانیم تعریف نسبتاً دقیقی از آن ارائه کنیم:تحلیل کُد استاتیک روشی برای رفع اشکال با بررسی کُد منبع قبل از اجرای برنامه است. این کار با تجزیه و تحلیل مجموعه‌ای از کُدها در برابر مجموعه‌ای (یا مجموعه‌های متعدد) از قوانین کُدگذاری انجام می شود.عبارت‌های تحلیل کُد استاتیک و تحلیل استاتیک اغلب به جای یکدیگر، همراه با تجزیه و تحلیل کُد منبع استفاده می‌شوند که همگی معنای یکسانی دارند. این نوع تحلیل، نقاط ضعف در کُد منبع را که ممکن است منجر به آسیب‌پذیری شوند، برطرف می‌کند. البته این امر ممکن است از طریق بررسی کُدهای دستی نیز حاصل شود؛ اما قاعدتاً استفاده از ابزارهای خودکار بسیار مؤثرتر است. تحلیل استاتیک معمولاً برای مطابقت با دستورالعمل‌های کُدگذاری، مانند MISRA و اغلب برای انطباق با استانداردهای صنعتی، مانند ISO 26262 استفاده می‌شود.اما تحلیل استاتیک نمی‌تواند تمام ایرادات یک برنامه را تشخیص دهد. به‌عنوان مثال، تحلیل استاتیک نمی‌تواند تشخیص دهد که آیا نیازمندی‌های نرم‌افزار برآورده شده است یا اینکه یک تابع چگونه اجرا می‌شود؟ همچنین تحلیل استاتیک در برابر مسائل زیر، پاسخی برای ارائه ندارد:عدم وجود درک از مقصود توسعه دهنده: تحلیل استاتیک ممکن است سَرریز احتمالی را در کُد تشخیص دهد؛ اما نمی‌تواند تعیین کند که عملکرد اساساً آنچه را که انتظار می‌رود، انجام می‌دهد یا نه.قوانین به‌طور ایستا قابل اجرا نیستند: برخی از قوانین کُدگذاری به اسناد خارجی دیگری بستگی دارند یا اینکه هر شخصی می‌تواند هرطور که می‌خواهد آن را تفسیر کند.نقص‌های احتمالی منجر به مثبت کاذب و منفی کاذب می‌شوند: در برخی شرایط، تحلیل استاتیک فقط می‌تواند گزارش دهد که یک نقص احتمالی وجود دارد. مثلاً اگر چیزی در مورد تابع جاری یا وابسته ندانیم، نمی‌توانیم بگوییم که متغیر فعلی چه مقداری خواهد داشت. بنابراین نتیجه غیرقابل تصمیم‌گیری است. این بدان معناست که تحلیل استاتیک ممکن است نقص‌هایی را گزارش کند که در واقع وجود ندارند (مثبت کاذب) یا ممکن است نقایص واقعی را گزارش ندهد (منفی کاذب).برای پاسخ به چنین سوالات و چالش‌هایی، باید از رویکرد تست پویا استفاده نمود که از حوصلۀ مبحث فعلی خارج است. به همین دلیل، تحلیل استاتیک و تست پویا مکمل یکدیگر هستند. تحلیل استاتیک، اشکالات در کُد را قبل از ساخت برنامه تشخیص می‌دهد و این تضمین می‌کند که یک محصول با کیفیت بالاتر به مرحلۀ آزمایش می‌رسد و با اطمینان از کارآمدتر بودن فرایندهای آزمایش، توسعۀ نرم‌افزار سرعت بیشتری می‌گیرد.در کنار چنین محدودیت‌هایی، تحلیل استاتیک فواید بسیاری دارد که از جملۀ آن‌ها می‌توان به موارد زیر اشاره نمود:حصول اطمینان از افزایش کیفیت کُدکشف و ارائۀ آسیب‌پذیری‌های امنیتی در وابستگی‌هاداشتن عملکردی همانند ابزارهای تست نرم‌افزار برای کشف خطاهاسریع‌تر بودن در مقایسه با بررسی دستی کُددقت بالاتر در مقایسه با بررسی دستی کُدمعرفی ابزارها و فناوریهای متن بازدر زمینۀ تحلیل استاتیک، ابزارهای بسیار زیادی وجود دارند و انتخاب از میان آن‌ها به ویژگی‌های پروژه از جمله زبان مورد استفاده، نیازمندی‌ها و قابلیت‌های خود ابزار وابسته است. در جدول زیر لیستی از ابزارهای متن‌باز تحلیل استاتیک آورده شده است (لیست کامل را از اینجا ببینید) که از میان آن‌ها به اختصار، سه ابزار برتر در ادامه توضیح داده خواهند شد. همچنین اگر به پیاده‌سازی و کارهای عملی علاقه دارید، یک ریپازیتوری قدرتمند در گیت‌هاب وجود دارد که همۀ ابزارهای تحلیل استاتیک را بر اساس زبان دسته‌بندی نموده است.ابزار SonarQubeابزار SonarQube، یک پلتفرم متن‌باز است که توسط شرکت SonarSource برای بازرسی مداوم کیفیت کُد و انجام بررسی‌های خودکار و تحلیل استاتیک برای شناسایی اشکالات، کُدهای مشکوک و آسیب‌پذیری‌های امنیتی در بیش از 20 زبان برنامه‌نویسی توسعه یافته است. این ابزار ابتدا Sonar نام داشت که بعدها نام آن به SonarQube تغییر پیدا کرد. البته این ابزار در چهار نسخۀ مختلف عرضه می‌شود که فقط نسخۀ Community آن مجانی است.ابزار SonarQube می‌تواند گزارش‌های متنوعی از جمله گزارشات کُدهای تکراری، استانداردهای کُدگذاری، تست‌های واحد، پوشش کُد، پیچیدگی کُد، اشکالات و آسیب‌پذیری‌های امنیتی ارائه دهد. همچنین SonarQube می‌تواند با محیط‌های توسعۀ معروف همانند Eclipse ،Visual Studio ،Visual Studio Code و IntelliJ IDEA از طریق پلاگین SonarLint ادغام شود.برای کسب اطلاعات بیشتر می‌توانید به ریپازیتوری گیت‌هاب SonarQube یا آدرس وبسایت آن مراجعه کنید.ابزار StyleCopابزار StyleCop، یک ابزار تحلیل کُد استاتیک متن‌باز از شرکت مایکروسافت است که کُد زبان #C را برای انطباق با سبک‌های کُدنویسی توصیه شده و زیرمجموعه‌ای از دستورالعمل‌های طراحی چارچوب دات‌نت مایکروسافت بررسی می‌کند. StyleCop کُد منبع را تجزیه و تحلیل نموده و به آن اجازه می‌دهد تا مجموعه قوانین متفاوتی را از FxCop (که به جای کُد منبع، مجموعه‌های کُد مدیریت شدۀ دات‌نت را بررسی می‌کند) اعمال نماید. البته به نظر می‌رسد که این ابزار به پایان عمر خود نزدیک شده و از محیط توسعۀ Visual Studio 2015 به بالاتر، ابزار StyleCopAnalyzer معرفی شده است.برای کسب اطلاعات بیشتر می‌توانید به ریپازیتوری گیت‌هاب StyleCop مراجعه کنید.ابزار Sparseابزار Sparse، نرم‌افزاری است که برای یافتن اشکالات احتمالی کُدنویسی در هستۀ لینوکس طراحی شده است. این ابزار، مشکلات شناخته شده را بررسی نموده و به توسعه دهنده اجازه می‌دهد تا حاشیه‌نویسی‌هایی را در کُد اضافه کند که اطلاعات مربوط به انواع داده‌ها را منتقل می‌کند؛ مانند فضای آدرسی که اشاره‌گرها به آن اشاره می‌کنند و قفل‌هایی که یک تابع ایجاد و یا آزاد می‌کند. لینوس توروالدز نوشتن ابزار Sparse را در سال 2003 آغاز کرد. جاش تریپلِت از سال 2006 پشتیبان اصلی آن بود، نقشی که کریستوفر لی در سال 2009 و لوک وَن اوستِنریک در نوامبر 2018 عهده‌دار شدند. ابزار Sparse تحت مجوز MIT منتشر شده است.برای کسب اطلاعات بیشتر می‌توانید به آدرس وبسایت Sparse مراجعه کنید.معرفی شرکت های ایرانیمتاسفانه در کشور ایران، هنوز فرهنگ تست کردن نرم‌افزار و کیفیت آن در میان جامعۀ توسعه دهندگان رایج نیست. بنابراین شرکت‌های باتجربه در این زمینه اندک هستند. بهرحال در این قسمت دو شرکت ایرانی که خدمات تحلیل استاتیک را ارائه می‌دهند، معرفی شده‌اند.شرکت مهندس پيشگان آزمون افزار ياسشرکت مهندس پيشگان آزمون افزار ياس در زمینۀ تست و تضمین کیفیت نرم‌افزار فعالیت می‌نماید و یکی از قدیم‌ترین شرکت‌ها در ایران است که چنین خدماتی را ارائه می‌دهد. شرکت مهندس پیشگان آزمون افزار یاس یک شرکت دانش بنیان بوده و در شورای عالی انفورماتیک عضویت دارد. از جمله خدماتی که توسط این شرکت ارائه می‌شود می‌توان تست عملکردی، تست بار و فشار، تست امنیت، ممیزی کیفیت نرم افزار، راه اندازی ابزارهای تحلیل استاتیک همچون JTest ،dotTest ،C++Test ،Sonar و Checkmarx نام برد.برای کسب اطلاعات بیشتر راجع به شرکت مهندس پیشگان آزمون افزار یاس به آدرس وبسایت آن مراجعه کنید.شرکت خانۀ تست ایرانشرکت خانۀ تست ایران، در زمینۀ تست نرم‌افزار و بهبود کیفیت آن‌ها و با هدف ارتقای دانش در پلتفرم‌های مختلفی از جملۀ وبسایت‌ها، اپلیکیشن‌های اَندروید، آی او اس و نرم‌افزارهای دسکتاپ فعالیت می‌نماید. این شرکت خدمات زیادی شامل مشاوره در زمینه‌های تست عملکردی و غیرعملکردی، تشکیل تیم تست نرم‌افزار و بهبود فرایند تست نرم‌افزار ارائه می‌دهد. همچنین انجام تست اتوماتیک توسط نرم‌افزارهای متن‌باز و تجاری از جمله خدمات این مجموعه است.برای کسب اطلاعات بیشتر راجع به شرکت خانۀ تست ایران به آدرس وبسایت آن مراجعه کنید.سخن پایانیتحلیل کُد استاتیک یک روش مطلوب جهت تست بهینۀ کُد و همچنین افزایش میزان اطمینان از برنامه است. در این پست مفهوم تحلیل استاتیک به همراه برخی ابزارهای مهم و متن‌باز معرفی شدند. پیشنهاد می‌شود درصورتیکه می‌خواهید مطالعات بیشتری داشته باشید، کتاب برنامه‌نویسی ایمِن با تحلیل استاتیک نوشتۀ جیکوب وِست را مطالعه نمایید. همچنین کتاب تحلیل استاتیک نرم‌افزار: تفسیر انتزاعی نوشتۀ ژان لوئیس بولانگِر نیز تمامی مباحث مرتبط با تحلیل استاتیک را پوشش می‌دهد.این مطلب به‌عنوان پاسخ برای بخشی از تمرین‌های درس معماری نرم‌افزار در دانشگاه شهید بهشتی نوشته شده است که امیدوارم از آن استفاده برده باشید.مراجع[1] (2021). GitHub - A curated list of static analysis tools. GitHub. https://github.com/analysis-tools-dev/static-analysis [2] How Static Code Analysis Works. Perforce Software. https://www.perforce.com/blog/qac/how-static-code-analysis-works [3] What Is Static Analysis? Static Code Analysis Overview. Perforce Software. https://www.perforce.com/blog/sca/what-static-analysis [4] Boulanger, J. (2013). Static Analysis of Software: The Abstract Interpretation. Wiley-Iste.[5] Chess, B., & West, J. (2007). Secure Programming with Static Analysis. Pearson Education.[6] Kaharovic, N. (2021, March 10). SonarQube - Get Started with Static Code Analysis! - Maestral. Medium. https://medium.com/maestral-solutions/sonarqube-get-started-with-static-code-analysis-dd0bd16f24e [7] Megida, D. (2020, November 23). A Beginner’s Guide to Static Code Analyzers - Level Up Coding. Medium. https://levelup.gitconnected.com/a-beginners-guide-to-static-code-analyzers-9bf0198f494f [8] N. (2020, June 5). تحلیل ایستا (Static Analysis). خانه تست ایران. http://sqmtest.ir/%d8%aa%d8%ad%d9%84%db%8c%d9%84-%d8%a7%db%8c%d8%b3%d8%aa%d8%a7-static-analysis/ [9] صفحه نخست. (2020). مهندس پیشگان. https://www.mohandespishegan.com/