معرفی ابزار آنالیز و بررسی کد ها| code analysis tool

به نام دانای بر حق

مقدمه

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

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

 

  • CLOC

این نرم فزار از نوع آنالیز ایستا کد می باشد که برای شمارش بلاک های کد، تعداد خطوط و تعداد توضیحات (comments) نوشته شده در سورس کدها مورد استفاده قرار می  گیرد. ابزاری بسیار دقیق است و فایل های تکراری را نیز نادیده میگیرد و سرعت قابل توجهی دارد با تفکیک زبان های برنامه نویسی بسیار تا کنون 159 زبان برنامه نویسی به فهرست زیر:

 

این نرم افزار به شکل زیر نصب میکند:

 

 

نحوه استفاده:

نمونه خروجی کد:

سایت مرجع cloc

  • SLOCCount

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

 

  1. Ada (.ada, .ads, .adb)
  2. Assembly (.s, .S, .asm)
  3. awk (.awk)
  4. Bourne shell and variants (.sh)
  5. C (.c)
  6. C++ (.C, .cpp, .cxx, .cc)
  7. C shell (.csh)
  8. COBOL (.cob, .cbl) as of version 2.10
  9. C# (.cs) as of version 2.11
  10. Expect (.exp)
  11. Fortran (.f)
  12. Haskell (.hs) as of version 2.11
  13. Java (.java)
  14. lex/flex (.l)
  15. LISP/Scheme (.el, .scm, .lsp, .jl)
  16. Makefile (makefile) – not normally shown.
  17. Modula-3 (.m3, .i3) as of version 2.07
  18. Objective-C (.m)
  19. Pascal (.p, .pas)
  20. Perl (.pl, .pm, .perl)
  21. PHP (.php, .php[3456], .inc) as of version 2.05
  22. Python (.py)
  23. Ruby (.rb) as of version 2.09
  24. sed (.sed)
  25. SQL (.sql) – not normally shown.
  26. TCL (.tcl, .tk, .itk)
  27. Yacc/Bison (.y)

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

 

برای نصب آن میتوانید از repo های رسمی Ubuntu به شکل زیر نصب کنید.

نحوه استفاده برای سورس کدها:

 

نمونه خروجی:

سایت مرجع SLOCCount

  • ESLint

ESLint یک ابزار آنالیز پویا است که در سال 2013 توسط Nicholas C. Zakas توسعه داده شده است که وظیفه اصلی آن بررسی بسامد یا فرکانس استفاده از کد ها میباشد. وظیفه دیگر آن پیدا کردن الگو های مشکل ساز و همچنین پیشنهاد راه حل صحیح برای آن است که همه این کارها را با مانیتور کردن کد ها هنگام استفاده به صورت علمی انجام میدهد، می توان گفت که به برنامه plug یا وصل میشود و در کنش ها و واکنش های آن پس از آنالیز کامل به شما گزارش صحیحی از نرم افزار میدهد، البته عملکرد آن بی نقص نیست ولی بسیار مهندسی شده و دقیق است. حقیر پس از استفاده از آن بسیاری از مشکلات خود را به راحتی حل کردم و گامی بسیار بزرگ در راستایی حرفه ای شدن است چه بسا یزرگترین ضعف آن این است که فقط از زبان جاوا اسکریپت پشتیبانی میکند و بر پایه آن نوشته شده است.

نحوه نصب در پزوژه های مبتنی بر nodejs:

 

نحوه استفاده:

ابتدا فایل json آن را پیکربندی کنید سپس با اجرا خروجی های آن را مشاهده نمایید.

سایت رسمی

 

  • CCPCheck

این ابزار Corss-Platform بوده و می تواند تا حد قابل قبولی در روند برنامه نویسی امن و بررسی کد به ما کمک کند. [ لینک ]

قابلیت integrate شدن با IDE های مختلف را دارد. از انجایی که مایکروسافت هم علاقه خاصی به گیت پیدا کرده ( The largest Git repo on the planet ) شاید شماهم از git برای مدیریت سورس ها استفاده می کنید، پس می توان از این ابزار بخوبی استفاده کرد و در هنگام commit سورس ها توسط این ابزار اسکن شود تا درصد خطا کمتر گردد و علاوه بر این، کمی فرآیند بررسی آنالیز کدها بصورت خودکار انجام شود. موارد استفاده از این ابزار تنها گیت نمی باشد بلکه می توان در Jenkins ، Tortoise SVN و … نیز استفاده کرد.

 

  • FlawFinder

یک ابزار دیگر برای بررسی کدهای C/C++ می باشد. یکی از قابلیت های که داره اینه  فایل patch رو هم با پارامتر --patch (-P)به عنوان ورودی قبول میکنه  شما می تونید diff بین سورس ها رو با ابزار مورد بررسی قراربدین. در حالیکه ابزار CPPCheck اسکن برروی فایل سورس انجام میده و ورودی Patch File رو نمیتونه اسکن کنه. [ لینک ]

 

  • Clang Static Analyzer

این ابزار بخشی از پروژه Clang می باشد که می توان بصورت جداگانه نیز از آن استفاده کرد. [لینک]

بصورت زیر می توان از این ابزار استفاده کرد:

این ابزار در مقایسه با ابزارهای داینامیک مانند valgrind و یا حتی santizier های خود clang بسیار متفاوت عمل می کند. بدین دلیل که ابزارهای داینامیک تنها بخشی از کدهایی که اجرا می شوند را مورد بررسی قرار می دهند بنابراین در آنالیز استاتیک بخش هایی از کد مورد بررسی قرار می گیرند که شاید اصلا اجرا نشوند. با استفاده از سوییچ -o می تونیم مسیری رو مشخص کنیم تا ریپورت های مربوطه بصورت فایل html ذخیره بشوند. مسیر پیش فرض /tmp است. بعد از اجرای ابزار در مسیر دلخواه فایل index.html مثل تصویر زیر ایجاد میشود که خلاصه ای اسکن انجام شده به همراه فایل های دیگری که روند تشخیص و تریگر شدن باگ ها را نشان می دهد.

 

  • Scitools Understand

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

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

بخش پرکاربرد دیگری از این ابزار در منوی کلیک راست آن می باشد که با توجه به بخشی که برروی آن کلیک می کنید (متغییر، توابع، کلاس ها، ساختارها و …) گزینه هایی که در اختیار ما قرار میگیرد متفاوت خواهد بود:

قابلیت بعدی این ابزار ایجاد گراف است که می توانیم مورادی چون CFG, ارتباط بین توابع call graphs و … بصورت جامع داشته باشیم. در تصویر زیر من گزینه Called by از تصویر فوق را برروی تابع ospf_flood_delayed_lsa_ack انجام دادم، میخواهم بدانم که این تابع توسط چه توابع دیگری اجرا می شود و نقطه آغازین در رسیدن روند اجرا به آن چگونه است.

ابزار understand  می تواند باتوجه استانداردهای کدنویسی موجود و یا استاندارد های تعریف شده توسط خودمان سورس ها را بررسی کند و مشکلات مدنظرمان را به ما گزارش دهد.

 

  • valgrind

درواقع یک فریمورک instrumentation است که برای ساخت ابزارهای آنالیز خودکارمورد استفاده قرار میگیره. که موقع نصب چند ابزار هم در اختیارما قرار میده تا بتونیم باگ هایی مرتبط با مبحث thread و حافظه رو در برنامه هامون کشف کنیم. اولین نکته که باید بگم در مورد نحوه تلفظ اسم این ابزاره که همه ما برای بار اول اشتباه میکنیم و یک چیز کاملا طبیعیه:

1.1. How do you pronounce “Valgrind”?

The “Val” as in the word “value”. The “grind” is pronounced with a short ‘i’ — ie. “grinned” (rhymes with “tinned”) rather than “grined” (rhymes with “find”).

Don’t feel bad: almost everyone gets it wrong at first.

 

خوب هم می توانیم سورس آن را از این لینک [+] دانلود و کامپایل کنیم و یا از با استفاده از apt-get install valgrind درون سیستم خودمون نصب کنیم. بعد از نصب ابزارهای مختلفی مثل callgrind, helgrind, DRD , … در اختیارمان قرار میگیر. در ادامه نحوه اجرای ابزار Memcheck را برروی یک سورس ساده انجام خواهیم داد:

خوب در بالا مشاهده میکنیم که باگ برای هیپ گزارش کرده است. ابزار پیش فرض valgrind نیز memcheck است که ست نمودن –leak-check اطلاعاتی بیشتری در اختیارمان قرار خواهد گرفت.

 

 

  • قابلیت های Sanitizer

این قابلیت توسط گوگل ایجاد شده است تا بخشی از LLVM باشد [لینک] . در gcc4.8 نیز قابلیت های مانند  ASAN,TSAN نیز پشتیبانی می شود. استفاده از sanitizers در روند فازینگ میتونه خیلی مفید باشه اما چون instrumentation در زمان کامپایل انجام میشه پس نیاز به سورس برنامه خواهیم داشت. بهرحال باید این مورد رو همیشه یادمون باشه که استفاده از این قابلیت تنها برای تست برنامه مورد استفاده قرار میگیرند و محصول نهایی نباید با این سوییچ ها کامپایل شود.

ASAN برای تشخیص خطاهای Use after free, Heap/Stack buffer overflow, Memory leaks, … مورد استفاده قرار میگیرد. برای استفاده از ASAN در Clang می توان از -fsanitize=address  استفاده کرد. MemorySanitizer  به ما این اطمینان را می دهد که دارای overhead کمتری نسبت به Valgrind است و سرعت بالاتری در روند اجرا و تست ها را خواهیم داشت.

 

خوب سورس قبل که توسط Valgrind چک کردیم حالا با استفاده از ASAN اون رو بررسی می کنیم:

مشاهده می کنیم که مشکل سرریز هیپ در سورس کدهایمان وجود دارد.

و اما نکته آخر که می تونیم در جهت داشتن برنامه ای امن بگیم، به جای نادیده گرفتن پیام های کامپایلری و suppress کردن آنها، بهتره که کدها رو بررسی و خطاها رو رفع کنیم. ممکنه درحین بررسی کدها با خطاهای زیادی روبرو بشین و با خودتون بگین که : “من کد رو درست نوشتم و بدرستی کارمیکنه بنابراین خطاها و اخطارهایی که میبینم False-Positive است!” اما شاید اینطور هم نباشه و کدی که شما نوشتین یک Smell Code باشه! و از پیچیدگی بیجا و صحیح ننوشتن کد دارین اون اخطار و خطا رو دریافت می کنین. پس با دقت بیشتر کدهاتون رو بررسی کنین و بجای پاک کردن صورت مسئله سعی در رفع مشکلات داشته باشید. هرچند هیچ چیزی عاری از خطا نیست و درصدی خطا چه در کد و چه در ابزارها وجود دارد و خواهد داشت.

 

‌A1Gard

اول از همه کوچک ترین عضو مجموعه 4xmen بنده حقیر هستم. در ثانی یک توسعه دهنده هستم زمینه های تخصصی کارم :‌ Delphi, PHP, C++ ,Python, JavaScript, Unity game engine, C#, asm و علاقه مند به لینوکس، RCE ، کریپتوگرافی هستم. تا الان حضرت حق اینا رو به ما داده و هر وقت که بخواد ازمون میگیره دست خودشه. یا حق، با حق، تا حق

More Posts

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *