Compilateurs

Après application poussée de la propagation de constantes, du repliement de constantes et de la suppression de code mort à la fonction ci-dessus, quelle valeur renvoie la fonction et quel code subsiste ?

int h(void) {
    int a = 5;
    int b = a * 3;
    int c = b - a;
    if (c > 100) return 0;
    return c * 2;
}
  1. AElle renvoie toujours 20, et le test de l'instruction if est supprimé
  2. BElle renvoie toujours 0, et return c * 2 est supprimé
  3. CTous les calculs subsistent, et elle renvoie 20 ou 0 à l'exécution
Afficher la réponse et l'explication

Réponse : A. Elle renvoie toujours 20, et le test de l'instruction if est supprimé

En propageant a = 5, on replie b = 5 * 3 = 15 et c = 15 − 5 = 10. La condition c > 100 devient 10 > 100, toujours fausse ; la branche return 0, jamais exécutée, est supprimée comme code mort. Le return c * 2 restant donne 10 × 2 = 20, et la fonction se réduit à return 20;. La condition étant toujours fausse, elle ne renvoie jamais 0, et aucun calcul ni test n'est nécessaire à l'exécution.

S'entraîner sur ce thème Retour au thème

Autres questions sur Compilateurs

  1. Quel est le rôle de l'analyse lexicale d'un compilateur ?
  2. Que fait l'analyse syntaxique d'un compilateur ?
  3. Quel exemple d'erreur détectée par l'analyse sémantique d'un compilateur est le plus approprié ?
  4. Quelle caractéristique de l'arbre syntaxique abstrait (AST) est correcte ?
  5. Quel est le principal avantage d'utiliser, à l'intérieur d'un compilateur, une représentation intermédiaire (IR) indépendante du langage source comme du CPU ?

Comparatifs sur ce thème