Criterio di copertura delle definizioni
Un test \(\ T\) soddisfa il criterio di copertura delle definizioni se e solo se per ogni nodo \(i\) e ogni variabile \(x \in \operatorname{def}(i)\), \(T\) include un caso di test che esegue un cammino libero da definizioni da \(i\) ad almeno uno degli elementi di \(\operatorname{du}(i, x).\)
Ci si vuole cioè assicurare di testare tutte le definizioni, assicurandosi che funzionino osservando almeno un uso del valore da loro assegnato. Matematicamente si può dire che:
$$ \begin{align*} T \in C_{def} \Longleftrightarrow& \forall i \in P, \ \forall x \in \operatorname{def}(i), \ \exists j \in \operatorname{du}(i, \, x), \\ & \exists t \in T \ \text{che esegue un cammino da $i$ a $j$ senza ulteriori definizioni di $x$}. \end{align*} $$
Riconsideriamo l’esempio già visto in precedenza, considerando la variabile \(\mathtt{a}\):
01 void main() {
02 float a, b, x, y;
03 read(x);
04 read(y);
05 a = x;
06 b = y;
07 while (a != b)
08 if (a > b)
09 a = a - b;
10 else
11 b = b - a;
12 write(a);
13 }
Partiamo definendo gli insiemi dei nodi degli usi \(\operatorname{du}(i, \, \mathtt a)\):
- \(\operatorname{du}(5, \, \mathtt a)\) = \({7, \, 8, \, 9, \, 11, \, 12}\);
- \(\operatorname{du}(9, \, \mathtt a)\) = \({7, \, 8, \, 9, \, 11, \, 12}\).
È solo un caso il fatto che in questo esempio tali insiemi siano uguali.
Comunque sia, l’obiettivo è per ognuna delle due definizioni ottenere un uso di tale definizione:
- Per la prima definizione la soluzione è banale, a riga 7 la variabile \(\mathtt a\) viene letta sempre: \(\D{5}\U{7}\).
- Per la seconda, invece, è necessario scegliere un valore tale per cui il flusso di esecuzione entri almeno una volta nel ciclo ed esegua almeno una volta la riga 9: \(\D{9}\U{7}\).
Un test che soddisfa totalmente il criterio può essere il seguente:
$$ T = { \langle 8, \, 4 \rangle }. $$
Come si vede, il criterio di copertura delle definizioni non copre tutti i comandi e di conseguenza non implica il criterio di copertura dei comandi.