2012-01-14 11 views
6

Digamos que tengo este pedazo de/C código C++:Cobertura básica de bloque: ¿cuál es la definición precisa?

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? 

Cuál es la cobertura bloque básico de caso de prueba a = 1, b = 12?

¿Es 75% o 50%?

¿Debo contar la 1ª y la última línea como bloques básicos? ¿Cuál es la definición precisa de bloque básico?

Otro punto de confusión:

int c = 16; 
d += c; 

Es un bloque básico o 2 bloques básicos? ¿Debería contar cada línea como un bloque básico?

Respuesta

5

Un bloque básico contiene todas las instrucciones que tienen la propiedad de que si una de ellas se ejecuta, entonces todas las demás en el mismo bloque básico son. Nombrando la primera instrucción del bloque básico líder llegamos a la siguiente definición de bloque básico: el conjunto de todas las instrucciones que siguen a un líder que se ejecuta si el líder se ejecuta. El líder es el comienzo del bloque básico.

Para determinar el líder, encuentre todas las instrucciones de salto en su código. Cada objetivo de salto y cada instrucción después de un salto es un líder. La primera instrucción en un método también es un líder.

Para encontrar los bloques básicos, simplemente siga todas las instrucciones de un líder a otro.

Su primer ejemplo:

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 

Usted tiene 4 bloques básicos allí: uno para cada rama de la if, uno para el printf después de la if y uno para la inicialización de c. Si a == 1 && b == 12 solo se ejecutan tres bloques básicos, la cobertura es del 75%.

Su segundo ejemplo no tiene instrucciones de salto => solo hay un bloque básico.

Cuestiones relacionadas