ردیف
مسیر
محدودیت مسیر
۱
۸،۱
X <= Y
۲
۸،۵،۴،۳،۲،۱
X>Y & Y-X<=0
۳
۶،۵،۴،۳،۲،۱
X>Y & Y-X>0
برای ارضاء محدودیتهای بدست آمده از مسیر در روش اجرای سمبلیک از ابزارهایی که براساس تئوری پیمانهای قابلیت ارضاء SMT [۴۳] هستند استفاده می کنند در این روش که از معروفترین آنها میتوان از Yices [45] نام برد این ابزار براساس الگوریتم DPLL [۴۴] کار می کند که شرح آن از حوصلهی این پایان نامه خارج است اما به طور خلاصه میتوان اشاره کرد که برای حل مسائل از جدول سیمپلکس بهره میبرد و با از آن میتوان در مورد ارضاء پذیر بودن یا نبودن یک ترکیب خطی بولی از معادلات یا نامعادلات تصمیم گیری کرد. روش Yices می تواند درباره ارضاء پذیر بودن یا نبودن فرمولهای مختلف شامل معادلات حقیقی خطی صحیح، اسکالرها، رکوردها، نوع داده های تودرتو، ارائههای توسعه پذیر، بردارهای بیتی ثابت و… تصمیم گیری کند یکی از مشکلات اصلی این روشها چنانکه در بالا مطرح شد قابلیت حل معادلات یا نامعادلات تنها به صورت خطی است در حالیکه ممکن است محدودیتهای مسیر به صورت خطی نباشد برای حل این مشکل روشهایی دیگری در این حوزه مطرح شد که اجرای پویای سمبلیک DSE[45] نام دارد تفاوت اصلی روش اجرای پویای سمبلیک و روش اجرای سمبلیک در توانایی اجرای یک برنامه به صورت واقعی [۴۶] برنامه، در کنار اجرای سمبلیک آن است برای آشکار شدن این موضوع به مثال زیر توجه کنید:
فرض کنید قطعه برنامهای به صورت زیر داشته باشیم. و فرض کنید مقادیر ۳- و ۷ به طور تصادفی و به ترتیب برای x و y تولید شده است چون محدودیت انشعاب برنامه به صورت معادله خطی نیست SMT نمیتواند آن را ارضاء کند بنابراین انشعاب Else اجرا خواهد شد در حالیکه مقدار واقعی z برابر با ۹ بوده است که با استفاده قابلیت اجرا واقعی یک برنامه در کنار اجرای سمبلیک روش DSE، میتوان مقدار ۹ را برای z قرار داد و انشعاب then شرط را نیز اجرا کرد.
void test_me(int x,int y){
z = x*x*x + 3*x*x + 9;
if(z != y){
printf(“Good branch”);
} else {
printf(“Bad branch”);
abort();
}
}
ترکیب روش اجرای پویای سمبلیک (DSE) با اسکیما
Mike Papadakis و Nicos Malevris از ترکیب دو روش DSE و اسکیما چهارچوبی برای تست جهش نرمافزارهای جاوا ارائه می کنند. فرایند تست با تولید ابر برنامهی اسکیما آغاز می شود همچنین ابزارهای تولید کنندهی اسکیما توانایی ایجاد ساختار برنامه به صورت گراف کنترل جریان را دارند سپس با بهره گرفتن از اجرای DSE بر روی ابر برنامهی اسکیمای ایجاد شده موارد تست مناسب ایجاد می شود و به اجرا کننده تست سپرده میشوند تا مسیر اجرا را انتخاب کند و با آنها اجرا کند این روند تا زمانیکه به میزان مشخصی از تعداد تکرار یا محدودیت زمانی برسیم ادامه میابد. یکی از مزیتهای مهم این روش نسبت به روشهای دیگر استفاده از مکانیزمی برای یافتن کوتاهترین مسیر در کد برنامه به جهت رسیدن به عبارت جهش یافته است، این امر از طریق یک روش اکتشافی محقق می شود در حقیقت برنامه به دنبال اجرای انشعاباتی است که کمترین فاصله را با عبارت جهش یافته داشته باشند. مشابه با کار فوق الذکر چهارچوب دیگری در این زمینه وجود دارد که با گرد آوری ابزارهای مختلف یک گام به جلو رفته و تست جهش را با ترکیب سه روش DSE، روشهای تکاملی و به ویژه اسکیما انجام میدهد. به بیان نویسنده با ترکیب این سه ابزار و اضافه کردن روش اسکیما به آن میتوان یک چهارچوب که عملکردی به مراتب قویتر از آنها به صورت جداگانه دارد ایجاد کرد ، در گام نخست همانگونه که در شکل(۳-۳) نشان داده شده است برای تولید ورودیهای تست از ECFG [۴۷] استفاده می کند که توانایی پوشش انشعابات برنامه و از بین بردن جهشها را به صورت خودکار دارد. در گام دوم با بهره گرفتن از روش اسکیما جهشها را درون کد برنامه جایگذاری می کند. در مرحله سوم از سه ابزارetoc (این ابزار با بهره گرفتن از الگوریتم ژنتیک ورودیهای مناسب تست را تولید می کند)، concolic و JPF-SE[48] (قابلیت اجرای پویایی سمبلیک را دارند) برای تولید ورودیهای تست، بهره میگیرد و همچنین عملکرد این سه ابزار را باهم مقایسه می کند.
شکل(۳‑۳): چهارچوب ارائه شده در مقاله [۴۰]
روش مشابه دیگری در این حوزه توسط Mike Papadakis مطرح شده است که مانند روش قبل با بهره گرفتن از شمای جهش و DSE به از بین بردن جهشها می پردازد مهمترین تفاوت این روش با روش قبل در استفاده از یک تابع اکتشافی [۴۹]مناسب برای یافتن کوتاهترین به جهت رسیدن به کد جهش یافته است در این روش انشعاباتی از کد برنامه اجرا خواهد شد که فاصلهی کمتری در رسیدن به کد جهش یافته دارند.
روشهای مبتنی بر جستجو
توسط K. Ayari،S. Bouktif و G. Antoniol [42] ارائه شده و براساس الگوریتم کلونی مورچه است. در مدل ارائه شده که در ش
کل(۳-۴) نشان داده شده است هر گره نشان دهنده یک پارامتر ورودی است. مسیرهای بین گرهها نشان دهنده تمامی مقادیر ممکن در دامنه آن گره است هر مورچه در هنگام شروع به صورت تصادفی مسیرهای بین گرهها را میپیماید پس از عبور از تمامی گرهها، برنامه را تست کرده و نتایج آنها را ارزیابی می کند. یکی از دغدغه های اصلی نویسنده ایجاد روشی برای تولید داده های ورودی پیوسته است برای حل این مشکل از روش[۵۰] PDF استفاده می کند. با بکارگیری این روش هر مورچه در هنگام عبور از مسیر فرمون دار به تشخیص خود می تواند مقداری از مسیر اصلی فاصله بگیرد تا بتوان دامنه پیوستهای از ورودی ها به وجود آورد.
شکل(۳‑۴): کلونی مورچه و تست جهش
شرح ابزار ارائه شده
ابزار ارائه شده براساس برنامههایی که با زبان جاوا نوشته شده اند کار می کند ما در روش خود برای تحقق سه اصل مطرح شده انجام کمتر، انجام هوشمندانه و انجام سریعتر به ترتیب از تکنیکهای تولید کمتر جهش، استفاده از یک روش فرابتکاری برای تولید داده های تست همراه با برخی ماژولهای کمکی اجرا به تست به صورت موازی و ابزارهای ترجمه بایت کد در جاوا استفاده کردیم. ابزار ارائه شده از چهار بخش اصلی تشکیل شده است که به شرح زیر است:
- تولید کننده جهشها
- تولید کننده ورودیهای تست
- اجرا کننده تست
- دستیاران