36 votes

Est-ce que C fait une différence entre la compilation et l'exécution d'un programme ?

Si l'évaluation d'une expression provoque un comportement non défini en C, et que l'expression est toujours évaluée lors de l'exécution du programme (par exemple, si elle apparaît au début de la phrase main ), est-il conforme si une implémentation le rejette à l'étape de la mise en œuvre ? temps de compilation ? Y a-t-il une différence en C entre la compilation/traduction d'un programme et son exécution ?

Je sais qu'il existe des interprètes pour le C. Comment sont-ils traités par la norme C concernant cette différence ?

Exemple (lecture d'un local non initialisé)

int main() {
  int i;
  return i;
}

Lors de son exécution, à n'importe quel stade de l'exécution (même avant que main est appelé), le programme peut faire quelque chose de drôle. Mais est-ce que quelque chose de drôle peut aussi se produire alors que nous n'avons même pas essayé de l'exécuter ? Peut-il provoquer un débordement de tampon dans le compilateur lui-même ?

40voto

Mat Points 104488

D'un projet de C11 :

3.4.3 comportement non défini

comportement, lors de l'utilisation d'une construction de programme non portable ou erronée, ou de données erronées, pour lesquelles la présente Norme Internationale n'impose aucune exigence

NOTE Les comportements non définis possibles vont de l'ignorance totale de la situation avec des résultats imprévisibles, au comportement pendant la traduction ou l'exécution du programme d'une manière documentée et caractéristique de l'environnement (avec ou sans émission d'un message de diagnostic). environnement (avec ou sans l'émission d'un message de diagnostic), <strong>pour terminer une traduction </strong>ou l'exécution (avec l'émission d'un message de diagnostic).

L'arrêt de la traduction est mentionné comme une conséquence possible d'un comportement non défini dans la note (non normative), donc les effets au moment de la compilation ne sont clairement pas destinés à être exclus. La partie normative le permet certainement - elle permet tout. Ainsi, un compilateur conforme peut interrompre la traduction s'il détecte un comportement non défini pendant la compilation.

En outre, en Conformité à $4 :

Si une exigence " doit " ou " ne doit pas " qui apparaît en dehors d'une contrainte ou d'une contrainte d'exécution est violée, le comportement est indéfini. Dans la présente Norme internationale, le comportement non défini est indiqué par les mots " comportement non défini " ou par l'omission de toute définition explicite du comportement. Il n'y a pas de différence d'accentuation entre ces trois expressions ; elles décrivent toutes un "comportement indéfini".

Aucune distinction n'est faite, ni dans la définition normative ni dans la description de conformité, entre le "temps de traduction" et le "temps d'exécution". Aucune différence n'est faite entre les différentes "variétés" de comportement non défini.

En outre, Rapport de défaut n°109 souligné par ouah en Un code qui ne sera jamais exécuté peut-il invoquer un comportement indéfini ? a ceci dans sa réponse :

[...] Si une expression dont l'évaluation entraînerait un comportement non défini apparaît dans un contexte où une expression constante est requise, le programme qui la contient n'est pas strictement conforme. De plus, si chaque exécution possible d'un programme donné entraîne un comportement non défini, le programme en question n'est pas strictement conforme.

Une implémentation conforme ne doit pas échouer à traduire un programme strictement conforme simplement parce qu'une certaine exécution possible de ce programme entraînerait un comportement non défini. [...]

Cela indiquerait qu'un compilateur ne peut pas échouer une traduction s'il ne peut pas déterminer statiquement que tous les chemins mènent à un comportement non défini.

14voto

Jack Points 61503

Dans la norme C11, §3.7.1 il est indiqué, sous la définition du terme comportement indéfini :

comportement indéfini comportement, lors de l'utilisation d'une construction de programme non portable ou erronée ou de données erronées, pour lequel la présente Norme internationale n'impose aucune exigence.

2 REMARQUE Le comportement indéfini possible va de l'ignorance totale de la situation à l'imprévisible imprévisibles, à un comportement pendant la traduction ou l'exécution du programme d'une manière documentée environnement (avec ou sans l'émission d'un message de diagnostic), pour mettre fin à une traduction ou à une exécution (avec émission d'un message de diagnostic) .

Je suppose donc que vous êtes autorisé à rejeter statiquement un programme qui contient un comportement non défini, même s'il est valide.

5voto

haccks Points 33022

est-il conforme si une implémentation le rejette au moment de la compilation ?

Cela peut ou non. La norme C en parle dans la section §3.4.3 :

C11 : 3.4.3 comportement indéfini

  1. comportement, lors de l'utilisation d'une construction de programme non portable ou erronée ou de données erronées, pour lesquelles la présente Norme internationale n'impose aucune exigence.

  2. REMARQUE Le comportement indéfini possible va de l'ignorance totale de la situation à des résultats imprévisibles, se comporter pendant la traduction ou l'exécution du programme d'une manière documentée et caractéristique de l'environnement (avec ou sans émission d'un message de diagnostic), pour mettre fin à une traduction ou à une exécution (avec émission d'un message de diagnostic) .

Donc, pour répondre à votre question : Peut-il provoquer un dépassement de tampon dans le compilateur lui-même ?

Oui, c'est possible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X