<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های a.hadadi</title><link>https://virgool.ir/feed/@a.hadadi</link><description></description><language>fa</language><pubDate>2026-11-11 07:03:46</pubDate><image><url>https://virgool.ir/images/default-avatar.jpg</url><title>a.hadadi</title><link>https://virgool.ir/@a.hadadi</link></image><item><title>Frama-C ابزار تحلیل کد</title><link>https://virgool.ir/@a.hadadi/httpsvirgoolio-arash-hadadi-frama-c-gfx1dfhynv7t</link><description>ابزار Frama-C برای تحلیل کد برنامه به زبان c استفاده می شود. اینجا با نصب ابزار Frama-C در ubuntu بطور عملی آشنا شده و چند ویژگی کد نمونه c را بررسی می کنیم.اگر سیستم عامل ubuntu را داشته باشید از این مرحله بگذرید و وارد مرحله نصب Frama-C شوید. چون سیستم عامل من windows10 هست و ابزارهایی مختص این سیستم عامل دارم ترجیح دادم vmware نصب کنم و ubuntu را بصورت vm اجرا کنم. البته Frama-C  را می توانید مستقیما در ویندوز نصب کنید و برای این کار باید از PowerShell ویندوز استفاده کنید اما در نهایت محیط گرافیکی ubuntu را نخواهید داشت و برای داشتن gui آن باید یک سری ابزار اضافی  نیز نصب کنید که پیچیدگی نصب را افزایش خواهد داد. بنابر این vmware نسخه 15 و ubuntu نسخه Ubuntu 18.04.4 LTS برای نصب انتخاب و vm آن نصب شد.اجرای سیستم عامل ubuntu از طریق vmنصب Frama-Cراهنمای نصب در لینک زیر قرار دارد اما بطور خلاصه دستورات نصب نیز ارائه شده است:https://frama-c.com/install-aluminium-20160501.html#installing-frama-c-on-windows-via-cygwin--opamsudo apt install opamopam install depextopam initopam depext frama-cبرای بررسی برنامه fibonacci  انتخاب شد که در فایل fibo.c قرار دارد و در انتهای این گزارش کد آن آورده شده است. در سیستم عامل ubuntu فولدری با اسم  c ایجاد کرده و سورس کد برنامه c که fibo.c است را در آن قرار داده ایم. داخل فولدر یک ترمینال برای خط فرمان باز کرده و در آن با دستور زیر برنامه frama-c را اجرا می کنیم.frama-c-guiسپس در برنامه frama-c از منوی project گزینه new project  را انتخاب می کنیم. و فایل fibo.c  را باز می کنیم.باز کردن فایل منبع Cمحیط برنامه بعد از باز کردن کد منبع cنحوه اجرای دستوراتقابلیت های Frama-c  از دو طریق در دسترس است، از طریق GUI (واسط کاربری) و از طریق Batch Mode  (اجرای دستورات در خط فرمان) . تمام دستوراتی که از طریق GUI  قابلیت اجرا دارند حتما دستور معادل Batch دارند اما لزوما برای تمام فرمان های Batch معادل GUI وجود ندارد.بررسی CallGraph  از منوی  analysis گزینه callgraph انتخاب شودگزینه های callgraphcallgraph با نحوه نمایش درختیcallgraph با نحوه نمایش عمومیcallgraph هردو نحوه نمایش در کنار هم   بررسی ویژگی  Inoutبرای بررسی ورودی ها و خروجی های توابع  از منوی analysis انتخاب گزینه   Inout شودگزینه های مربوط به Inoutبعد از اجرای Inout خطوط برنامه که مربوط به ورودی و خروجی هستند مشخص می شونددر کنسول به تفصیل خروجی و ورودی ها آورده شده استبررسی  Metricsاین گزینه را از CLI ادامه می دهیمفرمان زیر را در یک ترمینال نوشته و اجرا می کنیم:frama-c fibo.c -metricsدستور متریک و خروجی آن در خط فرمانبرای اینکه خروجی در یک فایل ذخیره شود می توانید دستور زیر را اجرا کنیدframa-c fibo.c -metrics &gt; fibo_metrics.txtدستور متریک با ایجاد فایل خروجی و مشاهده متریک های برنامه در فایلگراف pdgاین دستور را نیز از طریق CLI  انجام می دهیم. خروجی فایلی با پسوند dot  می باشد که اطلاعات نودها و یال های یک گراف را در خود دارد.frama-c -pdg -pdg-dot graph -pdg-print fibo.c &gt; pdg.dotخروجی pdg  در فایلی با پسوند dot  ذخیره می شودجهت مشاهده تصویری گراف بایستی با دستور زیر فایل dot  به pdf  تبدیل شود و گراف بصورت تصویری ساخته شود.dot -Tpdf graph.main.dot &gt; pdg.pdfخروجی pdg ذخیره شده در فایل dot  به گراف با پسوند pdf  تبدیل می شودخروجی نهایی pdg  بشکل گراف در فایل pdf  ذخیره شده است بررسی Postdominatorاین قسمت نیز از طریق CLIانجام می شود و دستور زیر باید اجرا شود:frama-c fibo.c -dot-postdom mainخروجی دستور postdom در فایل main.main.dot و main.printfibo.dot  ذخیره می شودبا اجرای دستور زیر خروجی dot مرحله قبلی به pdf  تبدیل می شود و گراف مربوطه در آن رسم می شودخروجی گراف Postdominator  بررسی Slicing جهت بررسی Slicing نسبت به متغیر n باید دستور زیر را در خط فرمان اجرا کرد:frama-c slice-wr n fibo.c -slice-print &gt; slice.txtاسلایس نسبت به متغیر n محاسبه و در فایل ذخیره می شودمحتوای فایل اسلایس نسبت به nدر حالت واسط کاربر نیز با کلیک راست روی متغیر مورد نظر، گزینه های slicing مختلفی وجود داردگزینه های Slice  در حالت GUIبررسی Usersاین گزینه از منوی analysis قابل انتخاب استمنوی usersخروجی تحلیل users  در قسمت کنسول برنامه قابل مشاهده استبررسی wpبا اجرای دستور زیر در خط فرمان می توان wp را بررسی کردframa-c -wp fibo.cاجرای Wp و نتیجه آنبررسی Obfuscatorبرای به هم ریختن syntax  کد و ناخوانا کردن و مخفی کردن منطق کد با حفظ کارکرد قبلی و semantic کد استفاده می شود. کاربرد عموما برای کد های امنیتی هنگامی که در محیطی با اعتماد کم اقدام به استقرار می شود جهت جلوگیری از آشکار شدن یا جلوگیری از دیکامپایل شدن کد استفاده می شود.برنامه اصلی خوانا و مشخصگزینه Obfuscate  از منوی analysisبرنامه obfuscate  شدهبررسی خصوصیت loopنامتغیرهای مربوط به حلقه های تکرار را مشخص شود. این ویژگي با یک برنامه دیگر که ضرب ماتریس انجام می دهد و لوپ های زیادی دارد تست شد.گزینه loop  در analysisخروجی در قسمت console مشخص است. بررسی occurrenceدفعات استفاده هر متغیر توسط occurrence مشخص می شود.گزینه occurrence  در منوی analysisنتیجه اجرا در کنسول برنامه قابل مشاهده است.ضمن آنکه با کلیک راست روی متغیر مورد نظر گزینه occurrence  برای متغیر مورد نظر در دسترس استگزینه occurrence از طریق کلیک راستکد برنامه c تست شده که با نام fibo.c ذخیره شده است:#include&lt;stdio.h&gt;//Arash_Hadadi_97443088//Program to print Fibonacci Series using Recursion// declaring the functionvoid printFibo(int );&#xA;int main(){    printf(&#34;\n\n\t\tStudytonight - Best place to learn\n\n\n&#34;);    int k, n;    long int i = 0, j = 1;    printf(&#34;Enter the length of the Fibonacci series: &#34;);    scanf(&#34;%d&#34;, &amp;n);    printf(&#34;\n\nfirst %d terms of Fibonacci series are:\n\n\n&#34;,n);    printf(&#34;%d &#34;, 1);    printFibo(n);    printf(&#34;\n\n\t\t\tCoding is Fun !\n\n\n&#34;);    return 0;}&#xA;void printFibo(int aj){    static long int first = 0, second = 1, sum;    if(aj &gt; 1)    {        sum = first + second;        first = second;        second = sum;        printf(&#34;%ld &#34;, sum);        printFibo(aj-1);    // recursive call    }    else    {        // after the elements, for line break        printf(&#34;\n\n\n&#34;);    }}</description><category>a.hadadi</category><author>a.hadadi</author><pubDate>Wed, 12 Feb 2020 19:44:26 +0330</pubDate></item></channel></rss>