Базовое покрытие блока - какое точное определение? - PullRequest
6 голосов
/ 14 января 2012

Допустим, у меня есть этот кусок кода C / C ++:

int c = 12; // Should I count this line as basic block?
if (a != 0 && b > 10) {
    c += (a + b);
} else {
    c += 1;
}
printf("%d", c); // Should I count this line as basic block?

Что такое базовое покрытие блока для контрольного примера a = 1, b = 12?

Это 75% или 50%?

Должен ли я считать первую и последнюю строки базовыми блоками? Какое точное определение основной блок ?

Еще одна путаница:

int c = 16;
d += c;

Это один базовый блок или 2 базовых блока? Должна ли каждая строка считаться базовым блоком?

1 Ответ

6 голосов
/ 05 августа 2013

Базовый блок содержит все инструкции, обладающие свойством, что если одна из них выполняется, то все остальные в том же базовом блоке выполняются. Называя первую инструкцию базового блока лидером , мы получаем следующее определение базового блока: набор всех инструкций, следующих за лидером, которые выполняются, если лидер выполняется. Лидер - начало базового блока.

Чтобы определить лидера, найдите все инструкции по переходу в вашем коде Каждая цель прыжка и каждая инструкция после прыжка является лидером. Первая инструкция в методе также является лидером.

Чтобы найти основные блоки, просто пройдите все инструкции от лидера до следующего.

Ваш первый пример:

int c = 12; // Leader
if (a != 0 && b > 10) { // Jump
    c += (a + b); // Leader
} else {
    c += 1; // Leader
}
printf("%d", c); // Leader -- target of jump from the end of the true branch

У вас есть 4 базовых блока: один для каждой ветви if, один для printf после if и один для инициализации c. Если a == 1 && b == 12 выполняется только три основных блока, то охват составляет 75%.

Ваш второй пример не имеет инструкции перехода => есть только один базовый блок.

...