تحلیل ایستای کد (Static Code Analysis)

تجزیه و تحلیل ایستای کد چیست؟تجزیه و تحلیل ایستای کد یا تجزیه و تحلیل کد منبع به عنوان بخشی از بازنگری کد که به عنوان تست جعبه سفید شناخته می‌شود انجام می‌شود و در مرحله پیاده‌سازی یک چرخه حیات توسعه امنیت (SDL) مورد استفاده قرار می‌گیرد. یک روش اشکال‌زدایی برنامه است که با بررسی کد بدون اجرای برنامه انجام می‌شود. این فرایند درک ساختار کد را فراهم می‌کند. تحلیل ایستای کد به اجرای ابزار تحلیل ایستای کد مربوط است و برای برجسته کردن امکان آسیب‌پذیری در کد منبع ایستا که در حال اجرا نیست با استفاده از روش‌هایی مانند تحلیل Taint و تحلیل جریان داده تلاش می‌کند. چنین ابزارهایی به طور خودکار نقص‌های امنیتی را با درجه بالایی از اطمینان و نقص واقعی را پیدا می‌کنند. چنین ابزارهایی به تحلیلگران کمک می‌کند تا بخش‌های مربوط به امنیت کد به صفر برسند و آن‌ها می‌توانند نقص‌ها را به صورت مؤثرتری پیدا کنند نسبت به ابزاری که به سادگی و به طور خودکار می‌توانند نقص‌ها را پیدا کنند.برخی از ابزارها به سمت یکپارچه‌سازی محیط توسعه حرکت می‌کنند. در انواع مشکلاتی که در طول فاز توسعه نرم‌افزار شناسایی می‌شوند، یک مرحله مهم و قدرتمندی در چرخه حیات توسعه برای استفاده از چنین ابزارهایی است که بازخوردهایی را برای توسعه‌ دهنده در مورد مسائلی که ممکن است در طول توسعه کد با آن‌ها مواجه شود را ارائه می‌دهد. این بازخوردها در مقایسه با آسیب‌پذیری‌ها که بسیار دیرتر در چرخه توسعه یافت می‌شوند، مفید هستند. تحلیل ایستای کد در مهندسی نرم‌افزار توسط تیم توسعه و تضمین کیفیت نرم‌افزار انجام می‌شود. تحلیل ایستای کد در یافتن مسائل کدگذاری مانند خطاهای برنامه‌نویسی، نقض‌های استاندارد کدنویسی، مقادیر تعریف نشده، نقض‌های نحوی، آسیب‌پذیری‌های امنیتی مورد استفاده قرار می‌گیرد.Static Cod Analysisتحلیل ایستای کد چگونه انجام می‌شود؟فرایند تحلیل ایستای کد تا زمانی که خودکار باشد، نسبتا ساده است. این فرایند قبل از تست نرم‌افزار و در مراحل اولیه توسعه اتفاق می‌افتد. در فعالیت‌های DevOps این فرایند در فاز ایجاد رخ می‌دهد. بعد از نوشتن کد، تحلیلگر کد را برای بررسی آن اجرا می‌کند و قوانین کدنویسی استاندارد تعریف شده یا قوانین از پیش تعریف شده سفارشی را بررسی می‌کند و تحلیلگر تطابق کد با قوانین تنظیم شده را بررسی می‌کند و موارد مثبت کاذب و منفی کاذب را شناسایی می‌کند. هنگامی که مشکلات کد حل شود، کد می تواند تست و اجرا شود. بدون داشتن ابزارهای تست کد، تحلیل ایستا سخت و زیاد است. زیرا انسان‌ها باید کد را بررسی کند و بفهمند که کد چگونه در محیط‌های زمان اجرا رفتار می‌کند. بنابراین استفاده از ابزارهایی که این فرایند را خودکار می‌سازند، سبب خلاص شدن از کاری طولانی و طاقت‌فرسا می‌شود و محیط کار کارآمدتری را ایجاد می‌کند.تکنیک‌های تحلیل ایستای کدتکنیک‌های مختلفی برای تحلیل ایستای کد منبع برای آسیب‌پذیری‌‌های احتمالی وجود دارد که ممکن است در یک راه‌ حل با هم ترکیب شوند. این تکنیک‌ها اغلب از تکنولوژی‌های موجود در کامپایلر تشکیل شدند. در ادامه تعدادی از این تکنیک‌ها معرفی می‌شوند.تحلیل جریان داده: تحلیل جریان داده برای جمع‌آوری اطلاعات زمان اجرا (پویا) در مورد داده در نرم‌افزار زمانی که در حالت ایستا هستند مورد استفاده قرار می‌گیرد. اطمینان حاصل می‌کند که داده‌های تعریف شده به درستی استفاده می‌شوند. همچنین از داده‌هایی که به درستی عمل می‌کنند، اطمینان حاصل می‌کند. در تحلیل جریان داده سه اصطلاح مورد استفاده قرار می‌گیرند که شامل بلاک اصلی (کد)، تحلیل جریان کنترل (جریان داده) و مسیر جریان کنترل (مسیری که داده‌ها طی می‌کنند) هست. بلاک اصلی یک دنباله از دستورات متوالی است که کنترل در شروع یک بلاک وارد می‌شود و از انتهای آن خارج می‌شود و بلاک فقط در انتهای آن می‌تواند متوقف یا منشعب شود.تحلیل کنترل: روی جریان کنترل در یک ساختار فراخوانی تمرکز می‌کند. یک جریان کنترل می‌تواند یک پردازش، تابع، متد یا یک زیر برنامه باشد.گراف جریان کنترلی: در یک نمایش گراف انتزاعی نرم‌افزار، نودهای موجود در گراف بلاک‌های اصلی را نشان می‌دهند. یال‌های جهتدار برای نمایش پرش‌ها (مسیرها) از یک بلاک به بلاک دیگر را نشان می‌دهد. اگر نود فقط یک یال خروجی داشته باشد، نشان‌دهنده بلاک ورودی است. اگر یک نود فقط یک یال ورودی داشته باشد، نشان‌دهنده بلاک خروجی است. در شکل زیر یک گراف جریان کنترلی نمایش داده شده است که node 1 یک بلاک ورودی و node 6 یک بلاک خروجی را نمایش می‌دهد.Control Flow Graph (CFG)تحلیل Taint: تجزیه و تحلیل Taint، متغیرهایی که با ورودی قابل کنترل کاربر آلوده می شوند را شناسایی می‌کند و آن‌ها را برای توابع آسیب‌پذیر احتمالی که به عنوان سینک شناخته می‌شود، ردیابی می‌کند. اگر یک متغیر آلوده قبل از این که اصلاح شود به تابع سینک منتقل و ارسال شود،‌به عنوان یک آسیب‌پذیری علامت گذاری می‌شود. برخی از زبان‌های برنامه‌نویسی مانند Perl و Ruby از بررسی Taint استفاده می‌کنند و در شرایط خاصی مانند پذیرش داده‌ها از طریق CGI فعال می‌شوند.تحلیل لغوی: تحلیل لغوی، نحو کد منبع را به توکن‌های اطلاعات برای انتزاع کد منبع تبدیل می‌کند و دستکاری و تغییر آن را آسان‌تر می‌سازد.تحلیل رابط: شبیه‌سازی‌ها را برای بررسی کد تایید می‌کند و اطمینان حاصل می‌کند که رابط با مدل شبیه‌سازی مطابقت دارد.تحلیل خطا و خرابی: خطا و خرابی را در مدل مؤلفه‌ها تجزیه و تحلیل می‌کند.همچنین می‌توان تحلیل ایستای کد دارای دسته‌بندی‌های دیگری مانند رسمی، زیبایی، ویژگی‌های طراحی، بررسی خطا و پیش‌بینی هست. اگر کد صحیح باشد در دسته رسمی قرار می‌گیرند. اگر کد با روش‌های استاندارد همگام شود در دسته زیبایی قرار می‌گیرد. دسته ویژگی‌های طراحی مربوط به سطح پیچیدگی‌ها است. دسته بررسی خطا به دنبال نقض‌های کد است. دسته پیش‌بینی می‌پرسد که کد در هنگام اجرا چگونه رفتار می‌کند.Static Code Analysis Technicsنقاط قوت تحلیل ایستای کددارای مقیاس‌بندی خوب است که می‌تواند روی نرم‌افزارهای زیادی بارها اجرا شود.می‌تواند موارد مورد نیاز را با استفاده از ابزار به صورت خودکار و با قابلیت اطمینان بالا پیدا کرد. که برای مواردی مانند سرریز بافر، نقص‌های SQL Injection و ... ابزارها و روش‌های تحلیل ایستای کد عالی هستند.می‌تواند همه کد را در برنامه ارزیابی کند و کیفیت کد را افزایش می‌دهد.در هنگام استفاده از ابزار خودکار در مقایسه با بررسی دستی کد، سرعت افزایش می‌یابد.همراه با روش تست معمولی، تست ایستا عمق بیشتری در اشکال‌زدایی کد فراهم می‌کند.ابزارهای خودکار کمتر در معرض خطای انسانی هستند.احتمال یافتن آسیب‌پذیری در کد را افزایش می‌دهد و امنیت وب یا برنامه را افزایش می‌دهد.می‌توان تحلیل ایستا را در یک محیط توسعه آفلاین انجام داد.نقاط ضعف تحلیل ایستای کدبسیاری از انواع آسیب‌پذیری‌های امنیتی به صورت خودکار به سختی یافت می‌شوند. مانند مشکلات احراز هویت، مسئله کنترل دسترسی، استفاده ناامن از رمزنگاری و .... ابزارها و حالت‌های فعلی تنها درصد نسبتا کمی از نقص‌های امنیتی برنامه را پیدا می‌کنند.دارای تعداد زیادی مثبت کاذب است.نمی‌توان مشکلات امنیتی را پیدا کرد. زیرا آن‌ها در کد نمایش داده نمی‌شوند.اثبات این که یک مسئله امنیتی شناسایی شده یک آسیب‌پذیری واقعی است، کاری دشوار است.برای بسیاری از ابزارها، تجزیه و تحلیل کدی که کامپایل نشده است، دشوار است. تحلیلگران اغلب نمی‌توانند کد را کامپایل کنند زیرا آن‌ها کتابخانه درست و مناسبی که دارای همه دستورات کامپایل و همه کدها باشد را ندارند.یک ابزار ممکن است در صورت وجود خطا و نقص در کد برنامه، نتواند نشان دهد که نقص و خطا چیست.نمی‌توان همیشه از همه قوانین کدگذاری پیروی کرد. مانند قوانینی که به اسناد خارجی نیاز دارند.تحلیل ایستا ممکن است زمان بیشتری را نسبت به روش‌های قابل مقایسه داشته باشد.تحلیل ایستا نمی‌تواند نحوه اجرای یک تابع را تشخیص دهد.کتابخانه‌های سیستمی و سوم شخص ممکن است قادر به تجزیه و تحلیل نباشند. زیرا در برنامه‌هایی که به صورت پویا کتابخانه‌های سوم شخص را از کد ایستا بارگیری می‌کنند، تحلیل پویا رویکرد عملی‌تری برای تضمین امنیت است.ابزارهای تحلیل ایستا به سختی می‌توانند یک مشکل غیرقابل انتظار را که ممکن است در طول زمان اجرا رخ دهد را تشخیص دهند.پیکربندی‌های نادرست منبع آسیب‌پذیری‌ها هستند و تحلیل ایستا به تنهایی برای تضمین امنیت برنامه کافی نیست.محدودیت‌های تحلیل ایستای کدابزارهای تحلیل ایستا ممکن است به دلیل اتکا به مدل‌های انتزاعی و نمایش جریان‌های داده و منطق برنامه همراه با ناتوانی در درک هدف توسعه دهنده در زمینه‌های کدنویسی معین نتایج مثبت کاذب و منفی کاذب تولید کند.مثبت کاذب: یک ابزار تحلیل ایستای کد اغلب نتایج مثبت کاذب را تولید می‌کند. جایی که ابزار آسیب‌پذیری احتمالی را گزارش می‌کند که در واقع درست و واقعی نیست که به این دلیل است که ابزار نمی‌تواند از یکپارچگی و امنیت داده که در برنامه از ورودی به خروجی جریان می‌یابد، مطمئن باشد. نتایج مثبت کاذب ممکن است هنگام تحلیل یک برنامه که با مؤلفه‌های کد بسته یا سیستم‌های خارجی تعامل دارد، گزارش شوند. زیرا بدون کد منبع، ردیابی جریان داده در سیستم خارجی و اطمینان از یکپارچگی و امنیت داده امکان‌پذیر نیست.منفی کاذب: استفاده از ابزارهای تحلیل ایستای کد می‌تواند نتایج منفی کاذب را ارائه دهد یعنی جایی که آسیب‌پذیری‌ها ایجاد می‌شوند ولی ابزار نمی‌توانند آن‌ها را گزارش دهند. ممکن است این اتفاق زمانی رخ دهد که یک آسیب‌پذیری جدید در یک مؤلفه خارجی کشف شود یا زمانی که ابزارهای تحلیل دانشی در مورد محیط زمان اجرا و پیکربندی ایمن و نحوه آن نداشته باشند.مقایسه تحلیل ایستا و تحلیل پویامزیت اصلی تحلیل ایستا این هست که می‌تواند خطاهایی را آشکار کند که تا زمانی که فاجعه‌ای رخ ندهد نمی‌توانند خود را نشان دهند. تحلیل ایستا اولین گام در کنترل کیفیت یک نرم‌افزار جامع است. بعد از انجام تحلیل ایستا، تحلیل پویا برای کشف خطاهای پنهان و نامحسوس یا آسیب‌پذیری‌ها است. در حوزه کامپیوتر استاتیک (ایستا) به معنای ثابت است در حالی که داینامیک (پویا ) به معنای قابلیت عمل یا تغییر است. تحلیل پویا شامل تست و ارزیابی یک برنامه بر اساس زمان اجرا است. تحلیل ایستا و پویا با هم در نظر گرفته می‌شوند و به عنوان تست جعبه سفید شناخته می‌شوند.تفاوت اصلی بین تحلیل ایستا و تحلیل پویا زمانی است که خطا در چرخه عمر توسعه نرم‌افزار پیدا می‌شود. تحلیل ایستا خطا را بین فاز کدنویسی و تست واحد بدون آن که هیچ کدی اجرا شود، تشخیص می‌دهد. تحلیل پویا خطا را در طول فاز تست واحد شناسایی می‌کند و نحوه رفتار کد در طول زمان اجرا را بررسی می‌کند. بنابراین بهترین راه برای تضمین امنیت برنامه، ترکیب هر دو تحلیل ایستا و پویا است. تحلیل ایستا می‌تواند با حذف بسیاری از مسائل قبل از اجرا ، کیفیت کلی کد و نرم‌افزار را بهبود بخشد،‌ در حالی که تحلیل پویا خطاها را در زمان اجرا و آسیب‌پذیر‌هایی که با استفاده از روش‌های ایستا قابل شناسایی نیستند را پیدا می‌کند.Static Code Analysis VS Dynamic Code Analysisابزارهای تحلیل ایستای کددر این بخش دو مورد ابزارهای منبع باز مهم و کاربردی مورد استفاده برای تجزیه و تحلیل ایستای کد به منظور افزایش کیفیت و بررسی کد معرفی و بررسی می‌گردند.ابزار SonarQubeاین ابزار در بررسی کیفیت و امنیت کد مورد استفاده قرار می‌گیرد و ابزارهایی برای مدیریت کیفیت مانند IDE یکپارچه، سرور یکپارچه ماندگار محبوب و ابزارهای بررسی کد را فراهم می‌کند. با استفاده از آن توسعه‌دهندگان می‌توانند کدهای تمیزتر ایمن‌تری بنویسند و توسعه‌دهندگان را در طول بررسی کد هدایت می‌کند. با هزاران قانون خودکار تحلیل ایستای کد در بیش از 25 زبان برنامه‌نویسی مانند Java، C#، JavaScript، TypeScript، C/C++، COBOL و .. مورد استفاده قرار می‌گیرد و مستقیما با پلتفرم DevOps ادغام می‌شود. این ابزار برای خودکارسازی بررسی کد مورد استفاده قرار می‌گیرد. از جمله معایب این ابزار، عدم پشتیبانی از هر IDE است. ویژگی‌های مهم ابزار SonarQube عبارتند از:چند زبان بودنتحلیل امنیتانتشار کد با کیفیتقابلیت نگهداریتشخیص مسائل پیچیدهSonarQubeابزار DeepSourceیک ابزار خوب برای تحلیل ایستای کد است که برای تشخیص کیفیت کد و مسائل امنیتی در چرخه عمر توسعه نرم‌افزاز استفاده می‌شود. یکی از سریع‌ترین و کم نویزترین ابزارهای تحلیل ایستا است و ریسک‌های خطا، ضد الگوها، عملکرد و مسائل امنیتی را قبل از این که در محصول نهایی مداخله کنند، تشخیص می‌دهد. توسعه‌دهندگان در راه‌اندازی و توسعه این ابزار مشکلی ندارند. این ابزار می‌تواند خطاها و برخی از مشکلات رایج را در کد به صورت خودکار در طول بررسی کد پیدا کند و ترمیم هایی را برای آن‌ها تولید کند و به صورت خودکار کد را قالب‌بندی می‌کند. این ابزار برای پروژه‌های منبع باز و تیم‌های کوچک رایگان است و برای شرکت‌ها یک گزینه استقرار self hosted را پیشنهاد می‌دهد. این ابزار می تواند با Bitbucket، GitHub یا GitLab ادغام شود. DeepSource معیارهایی مانند تعداد وابستگی، پوشش اسناد و ... را به صورت خودکار تولید و ردیابی می‌کند. ازجمله معایب این ابزار در دسترس نبودن پشتیبانی از زبان PHP است. ویژگی‌های مهم ابزار DeepSource عبارتند از:پیکربندی تک‌فایلبررسی کیفیت برای درخواست Pullطیف گسترده‌ای از پوشش مشکلات را دارد.تحلیل‌گران را به طور فعال نگه‌ می‌دارد.شناسایی و تفسیر مسائل با جزئیاتردیابی معیارهای کدتحلیلگران می‌توانند ترمیم‌هایی را برای مشکلاتی که رخ می‌دهند را پیشنهاد دهند و در صورتی که به آ‌ن‌ها اجازه داده شود، می‌توانند درخواست‌های Pull را با ترمیم آن‌ها ایجاد کنند.پشتیبانی از زبان‌های python، JavaScript، go، ruby، java و ...DeepSourceشرکت‌های فعال در زمینه آزمون و کیفیت نرم‌افزار و تحلیل ایستای برنامهدر این بخش دو مورد از شرکت‌های ایرانی فعال در حوزه آزمون و کیفیت نرم‌افزار و تحلیل ایستای کد برنامه و محصولات آن‌ها معرفی می‌شوند.آزمایشگاه آزمون و تایید نرم‌افزار دانشگاه شهید بهشتیاین آزمایشگاه در طراحی و اجرای انواع آزمون‌‏ها بر روی سامانه‏‌های نرم‏‌افزاری و ارزیابی کیفیت نرم‌‏افزارها فعالیت می‌کند. با هدف رشد صنعت آزمون نرم‏افزار و سایر حوزه‏های مرتبط با کیفیت نرم‏افزار ایجاد شده است. خدمات این آزمایشگاه عبارتند از:طراحی و اجرای آزمونهای عملکردی (Functional): در انجام آزمونهای عملکردی، آزمایشگاه ابتدا به تحلیل آزمون می پردازد، سپس طراحی آزمون انجام می‌شود. در ادامه، فعالیت پیاده سازی آزمون انجام خواهد شد و در نهایت، اجرای آزمون صورت می پذیرد. در این مرحله، محیط آزمون راه اندازی شده، اسکریپتهای آزمون اجرا شده و نتایج آزمون در قالب گزارشهای آزمون ثبت و تحلیل می شوند.آزمون کارایی: آزمایشگاه، خدمات آزمون در موضوع کارایی نرم‌افزار را در انواع مختلف آزمون بار، آزمون فشار، آزمون استقامت، آزمون مقیاس پذیری، آزمون حجم و پروفایلینگ و همچنین مشاوره در اجرای فرآیند توسعه مبتنی بر کارایی ارائه می‌کند.آزمون امنیت: آزمایشگاه رخدمات مشاوره و آزمون در موضوع امنیت نرم‌افزار را در سطوح مختلف قبل از توسعه نرم‌افزار، در فاز تحلیل و طراحی، در فاز کدنویسی و بعد از تولید و استقرار محصول نرم‌افزاری ارائه می‌کند. در ارتباط با این آزمون، حوزه های محرمانگی، جامعیت محتوا، قابلیت دسترس‌پذیری، احراز هویت و صلاحیت کاربران، انکارناپذیری عملکرد نرم‌افزار و کاربران و ... درنظر گرفته می شوند.مشاوره و نظارت بر فرایند آزمون: علاوه بر خدمات آزمایشگاه در حوزه های مختلف تحلیل، طراحی، پیاده‌سازی و اجرای انواع آزمون‌ها، خدمات آزمایشگاه به صنعت در قالب مشاوره و نظارت بر فرآیند آزمون، تاسیس دپارتمان آزمون در شرکت‌ها، موسسات و سازمان‌ها، افزایش قابلیت آزمون پذیری نرم‌افزارها، آموزش زمینه‌های مختلف مرتبط با آزمون، توسعه، سفارشی‌سازی و ارائه ابزارهای مختلف آزمون می‌باشد.ارتقاء میزان آزمون‌پذیری نرم‌افزار: آزمایشگاه با هدف ارتقاء میزان آزمون‌پذیری نرم‌افزارها، مواردی از جمله بررسی راه‌های کاهش پیچیدگی نرم‌افزار، کاهش عدم قطعیت در رفتار نرم‌افزار و کاهش وابستگی‌ها را پوشش می‌دهد و افزایش ساختار مناسب برنامه‌ها از طریق حذف وابستگی‌های چرخشی و افراز کلاس‌ها و بسته‌ها با هدف کاهش پیچیدگی واسط‌های نرم‌افزاری از طریق آزمون‌های تعبیه شده صورت می‌گیرد.شرکت مهندس پیشگان آزمون افزار یاسهدف این شرکت ارتقا تعالی سازمانی از طریق تضمین کیفیت خدمات و محصولات نرم‌افزاری است و استراتژی کاری آن طبق استاندارد و متدلوژی و به کارگیری ابزارهای مدرن است. این شرکت به منظور آزمون و کیفیت نرم‌افزار از ابزارهایی در زمینه مدیریت کیفیت، تست کارکردی، تست کارایی، تست امنیت، تست برنامه‌نویسی، تحلیل ایستا، تحلیل پویا و مانیتورینگ استفاده می‌کند. چشم‌انداز این شرکت عبارتند از:ارائه راهکارهای ارزیابی، تست و تضمین کیفیت نرم‌افزاررفع مشکلات کندی، قطعی و امنیت سیستم‌های نرم‌افزاریکاهش هزینه‌های تست و تضمین کیفیت با ابزارهای خودکارمشاوره و نظارت بر کیفیت فرایند تولید سیستم‌های نرم‌افزاریخدمات این شرکت به منظور آزمون و تضمین کیفیت نرم‌افزار عبارتند از:انجام پروژه های برون سپاری در زمینه تست و تضمین کیفیتارائه مشاوره در زمینه تست و تضمین کیفیت نرم افزارآموزش راهکارهای تست و تضمین کیفیت نرم افزارکمک به تهیه RFP جهت تدوین شرایط پذیرش یک سیستمراه اندازی تیم تست و تضمین کیفیت نرم افزارارائه ابزارهای پیشرفته‌ تست و تضمین کیفیتتست نفوذ و امنیت نرم افزار، شبکه و زیرساختنظارت بر تحویل یک سیستم و انجام تست های پذیرشممیزی کیفیت فرایند تولید نرم افزارجمع‌بندیدر این مقاله ابتدا در بخش اول به معرفی و بررسی تحلیل کد ایستا در حوزه معماری نرم‌افزار و توسعه نرم‌افزار پرداخته شد و سپس در بخش دوم دو مورد از ابزارهای مورد نیاز به منظور تحلیل کد ایستا و تضمین کیفیت و آزمون نرم‌افزار معرفی شدند و در پایان نیز دو مورد از شرکت‌های ایرانی فعال در حوزه ارائه خدمات مربوط به کیفیت و تضمین نرم‌افزار به همراه محصولاتی که ارائه می‌دهند معرفی و بیان گردید.«این مطلب، بخشی از تمرینهای درس معماری نرم‌افزار در دانشگاه شهیدبهشتی است»منابع و مراجع: https://owasp.org/www-community/controls/Static_Code_Analysis https://whatis.techtarget.com/definition/static-analysis-static-code-analysis https://www.whitehatsec.com/glossary/content/static-analysis https://dzone.com/articles/top-7-static-code-analysis-tools https://www.softwaretestinghelp.com/tools/top-40-static-code-analysis-tools/ http://ticksoft.sbu.ac.ir/ http://mohandespishegan.com/