Si un programme ne reçoit que des données fiables, et s'il ne doit répondre à aucune exigence comportementale lorsque des données conçues de manière malveillante sont fournies, il peut alors être possible de générer un code légèrement plus efficace que ce qui serait requis s'il y avait des exigences auxquelles il devait répondre pour toutes les données.
Étant donné que certaines tâches impliquent uniquement le traitement de données fiables, tandis que d'autres impliquent le traitement de données provenant de sources non fiables, la norme C autorise les implémentations destinées uniquement aux tâches précédentes. optimisations qui seraient inappropriées dans celles destinées à ces dernières, et à celles destinées à convenir à ces dernières tâches pour offrir des garanties qui empêcheraient inutilement les optimisations qui pourraient être utiles lors du traitement des premières.
Malheureusement, le La norme ne fournit aucun moyen par lequel les implémentations peuvent indiquer les types de garanties comportementales qu'elles offriront au-delà de celles prescrites par la norme. Lors de la rédaction de la C89, les auteurs s'attendaient à ce que "le marché" fasse un meilleur travail que les auteurs de la norme pour déterminer quels types d'implémentations devraient prendre en charge quelles "extensions populaires" en se comportant au moins de manière assez prévisible dans les cas où la norme n'imposait aucune exigences, et une telle attitude n'a pas changé même si elle ne correspond plus au marché actuel des compilateurs.
Étant donné quelque chose comme:
if (x! = 0) launch_nuclear_missiles (); ... et puis, éventuellement dans une autre fonctionz = y / x;
certaines personnes verraient un compilateur qui remplace le "si" par un appel inconditionnel à launch_nuclear_missiles ()
comme supérieur à celui qui n'appelle launch_nuclear_missiles
que si x
est différent de zéro, mais un tel comportement ne serait approprié que lors du traitement de tâches qui n'impliqueront jamais d'entrée non fiable.
Si l'on sait que les compilateurs que l'on utilise maintiendront les types de faibles garanties comportementales que les compilateurs à usage général offraient naturellement, et qui facilitent l'écriture de programmes qui pourraient rencontrer de faibles contraintes comportementales même lorsqu'ils sont donnés de manière malveillante. les intrants fabriqués, puis la division par zéro pourrait ne pas poser de problèmes de sécurité. Cependant, avec des compilateurs à optimisation agressive qui ne sont pas conçus pour être adaptés aux tâches impliquant des entrées non fiables, il sera nécessaire d'ajouter suffisamment de logique de contrôle de sécurité pour annuler tous les avantages que de telles "optimisations" auraient pu offrir.