Aller au contenu principal

Vérification et Tests

Althread permet de vérifier formellement le comportement de vos programmes. Il existe deux approches : les invariants simples et la logique temporelle linéaire (LTL).

Invariants Simples

Le bloc always permet de définir des propriétés simples sur l'état global du programme, qui doivent toujours être vraies, dans tous les états accessibles.

Exemple :

shared {
let X: int = 0;
}

program A() {
X++;
}

always {
X >= 0;
}
info

Ici, le bloc always vérifie que la variable partagée X est toujours supérieure ou égale à 0. Il n'est pas possible d'accéder aux variables locales des processus.

Logique Temporelle (LTL)

Pour des propriétés plus complexes impliquant le temps et la causalité (ex: "si je fais une requête, j'obtiens toujours une réponse plus tard"), Althread propose le bloc check.

Le bloc check contient une formule LTL (Linear Temporal Logic).

Opérateurs LTL

OpérateurSyntaxe AlthreadDescription
Toujoursalways ( P )P doit être vrai maintenant et pour tout le futur.
Éventuellementeventually ( P )P doit être vrai à un moment donné (maintenant ou plus tard).
Suivantnext ( P )P doit être vrai à l'état suivant.
Jusqu'à( P ) until ( Q )P doit être vrai jusqu'à ce que Q soit vrai (Q doit arriver).
Implicationif P { Q }Si P est vrai, alors Q doit être vrai.

Exemples de formules

Sûreté (Safety) : "Deux feux ne sont jamais verts en même temps"

check {
always (Feu1_rouge || Feu2_rouge);
}

Vivacité (Liveness) : "Si le feu est rouge, il finira par devenir vert"

check {
always ( if (Feu == ROUGE) { eventually (Feu == VERT) } );
}

Réponse : "Toute requête reçoit une réponse"

check {
always ( if Requete { eventually Reponse } );
}

Structure d'un projet de vérification

Il est recommandé de grouper vos propriétés dans plusieurs blocs check pour isoler les problèmes.

check {
// Propriété critique
always ( X > 0 );
}

check {
// Propriété de fairness
always ( if Requete { eventually Reponse } );
}
Fonction assert

Pour des vérifications impératives au sein du code des processus, consultez la documentation de la fonction assert().