Betrachten Sie den folgenden Code (zu Demonstrationszwecken only ):
%Vor%Laut Antworten auf diese Frage wird die maximale Stapelgröße von Visual Studio festgelegt.
Stimmt die Annahme, dass Benutzer vor einem möglichen Stack-Überlauf warnen könnten? (Ich habe das selbst versucht und habe keine Warnung bekommen)
P.S: Der einzige Grund, den ich stelle, ist, weil ich viele Fragen zu SO sehe, die durch eine solche Warnung verhindert werden könnten (Ja, ich weiß nicht, dass jeder SO Benutzer VS benutzt).
In den Editionen, für die das Flag /analyze
verfügbar ist, gilt dies bereits:
Das mit dem DDK / WDK gelieferte Werkzeug prefast
erzeugt ähnliche Warnungen.
Natürlich ist dies eine sehr einfache statische Prüfung (wenn die Stapelbenutzung der Funktion über einem bestimmten Schwellenwert liegt). Es versucht nicht, rekursive Aufrufe zu erkennen oder die totale statische Nutzung über Aufrufketten aufzurechnen.
Der Compiler könnte eine Warnung für fast alles geben, aber in diesem Fall wäre es für den Compiler ziemlich schwierig, eine wirklich bedeutsame Warnung zu geben.
Insbesondere ist die Stapelgröße bis zur Verbindungszeit nicht wirklich ausgewählt. Da der Compiler vor dem Linker ausgeführt wird, ist es im Grunde unmöglich zu wissen, welche Stackgröße Sie beim Ausführen des Linkers auswählen könnten. Wenn also der Compiler eine Warnung ausgeben würde, wäre es am besten, anzunehmen, dass eine "vernünftige" Stack-Größe ausgewählt wird, und die Warnung darauf zu gründen, dass sie dies verletzt.
Ein hinreichend intelligenter Linker könnte vermutlich eine solche Warnung ausgeben, aber es würde einiges an Intelligenz erfordern. Insbesondere zu dem Zeitpunkt, zu dem der Linker es sieht, sieht die Stapelzuweisung ungefähr so aus (die Maschinencodedarstellung von):
%Vor%Der Linker müsste jeden Ort finden, an dem der Stapelzeiger manipuliert wurde, und die Größe der betreffenden Nummer untersuchen, um Warnungen sinnvoll auszugeben. Um das zu tun, müsste man im Grunde genau herausfinden, was Code ist und was Daten sind, und den Code disassemblieren und untersuchen (aber nicht die Daten, die in unsinnigen Code zerlegt werden könnten). Das ist wahrscheinlich alles möglich, aber wahrscheinlich etwas nicht-trivial und sicherlich weit außerhalb des Bereichs der Dinge, mit denen Linker normalerweise arbeiten oder arbeiten.
Tags und Links c++ visual-studio stack-overflow