Граф потока управления
• Инструкции (линейные участки) – вершины (покрытие инструкций)
•Возможные переходы – ребра (покрытие ветвей)
•Метки def и use по переменным
1 |
int gcd(int a, int b) { |
|
ub, db |
|
|
|
|
||||
2 |
if(a > 0 && b < 0 || a < 0 && b > 0) b = -b; |
|
|||
|
|
|
|||
|
|
|
|||
3 |
while(b != 0) { |
|
|
|
|
4 |
if(b > a && a > 0 || b < a && a < 0) { |
|
|
|
|
5 |
int t = b; |
|
|
ua, ub |
|
6 |
b = a; |
|
|
||
|
|
|
|
||
7 |
a = t; |
ub, dt, ua, |
|
|
|
|
|
||||
8 |
} |
db, ut, da |
|
|
|
9 |
b = a-b; |
|
|
||
|
|
|
|
||
10 |
a = a-b; |
|
|
|
|
11 |
} |
|
|
|
|
|
|
|
|
||
12 |
return a; |
|
|
|
|
13 |
} |
|
|
|
|
da, db
ua, ub
ub
ua
ua, ub, db, da
Кулямин В.В. ФКН ВШЭ, ПИ / ВМК МГУ |
Основы инженерии программного обеспечения |
21 |
Пример ошибки (MS Zune)
year = ORIGINYEAR; /* = 1980 */
while (days > 365)
{
if (IsLeapYear(year))
{
if (days > 366)
{
days -= 366; year += 1;
}
}
else
{
days -= 365; year += 1;
}
}
else |
|
00:00 31.12.2008 |
[IsLeapYear(year) |
|
|
|
|
|
&& days = 366] |
|
|
|
|
|
Кулямин В.В. ФКН ВШЭ, ПИ / ВМК МГУ |
Основы инженерии программного обеспечения |
22 |
Графы для более высоких уровней
•Граф вызовов функций
•Вершины – функции
•Ребра – их обращения друг к другу
•Метки d, u – модификации и чтения полей классов и глобальных данных
•Граф вызовов модулей
•Тот же, только все функции одного модуля стягиваются в одну вершину
•Метки остаются только для глобальных данных (внутримодульные переменные убираем)
•Иногда в качестве данных для меток берут только таблицы БД
•Обычно используют покрытия вершин, дуг и du-пар
Кулямин В.В. ФКН ВШЭ, ПИ / ВМК МГУ |
Основы инженерии программного обеспечения |
23 |
Конец
