Wenn ein Programm nur vertrauenswürdige Daten empfängt und keine Verhaltensanforderungen erfüllen müsste, wenn böswillig gestaltete Daten angegeben werden, kann möglicherweise etwas effizienterer Code generiert werden, als dies bei einem bestimmten Verhalten erforderlich wäre Anforderungen, die es für alle Daten erfüllen musste.
Da einige Aufgaben nur die Verarbeitung vertrauenswürdiger Daten beinhalten, während andere die Verarbeitung von Daten aus nicht vertrauenswürdigen Quellen beinhalten, ermöglicht der C-Standard Implementierungen, die nur für die früheren Aufgaben vorgesehen sind Optimierungen, die für diejenigen, die für letztere vorgesehen sind, und für diejenigen, die für letztere Aufgaben geeignet sind, unangemessen wären, um Garantien zu bieten, die Optimierungen unnötig behindern würden, die bei der Verarbeitung der ersteren nützlich sein könnten.
Leider ist die Der Standard bietet keine Möglichkeit, mit der Implementierungen angeben können, welche Arten von Verhaltensgarantien sie über die vom Standard vorgeschriebenen hinaus bieten. Als C89 geschrieben wurde, erwarteten die Autoren, dass "der Marktplatz" einen besseren Job als die Autoren des Standards machen könnte, um zu bestimmen, welche Arten von Implementierungen welche "populären Erweiterungen" unterstützen sollten, indem sie sich zumindest etwas vorhersehbar verhalten, wenn der Standard Nein auferlegt Anforderungen, und diese Einstellung hat sich nicht geändert, obwohl sie nicht mehr zum heutigen Compiler-Markt passt.
Gegeben etwa:
if (x! = 0) launch_nuclear_missiles (); ... und dann, möglicherweise in einer anderen Funktionz = y / x;
, würden einige Leute einen Compiler anzeigen, der das "if" durch einen bedingungslosen Aufruf von launch_nuclear_missiles () ist einem überlegen, der launch_nuclear_missiles
nur aufruft, wenn x
ungleich Null ist. Ein solches Verhalten wäre jedoch nur dann angemessen, wenn Aufgaben verarbeitet werden, die niemals nicht vertrauenswürdige Eingaben beinhalten.
Wenn man weiß, dass die Compiler, die man verwendet, die Arten von Garantien für schwaches Verhalten einhalten, die Allzweck-Compiler selbstverständlich angeboten haben und die das Schreiben von Programmen erleichtern, die schwache Verhaltensbeschränkungen erfüllen können, selbst wenn sie böswillig angegeben werden. gestaltete Eingaben, dann Division durch Null stellen möglicherweise keine Sicherheitslücken dar. Bei aggressiv optimierenden Compilern, die nicht für Aufgaben mit nicht vertrauenswürdiger Eingabe geeignet sind, muss jedoch eine ausreichende Logik zur Sicherheitsüberprüfung hinzugefügt werden, um alle Vorteile zu negieren, die solche "Optimierungen" hätten bieten können.