Базовый блок содержит все инструкции, обладающие свойством, что если одна из них выполняется, то все остальные в том же базовом блоке выполняются. Называя первую инструкцию базового блока лидером , мы получаем следующее определение базового блока: набор всех инструкций, следующих за лидером, которые выполняются, если лидер выполняется. Лидер - начало базового блока.
Чтобы определить лидера, найдите все инструкции по переходу в вашем коде Каждая цель прыжка и каждая инструкция после прыжка является лидером. Первая инструкция в методе также является лидером.
Чтобы найти основные блоки, просто пройдите все инструкции от лидера до следующего.
Ваш первый пример:
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%.
Ваш второй пример не имеет инструкции перехода => есть только один базовый блок.