Ist die Verwendung eines veralteten C-Compilers ein Sicherheitsrisiko?

139

Wir haben einige Build-Systeme in der Produktion, die niemanden interessieren, und auf diesen Maschinen werden alte Versionen von GCC wie GCC 3 oder GCC 2 ausgeführt.

Und ich kann das Management nicht davon überzeugen, es auf ein neueres zu aktualisieren: Sie sagen: "Wenn es nicht kaputt ist, reparieren Sie es nicht."

Da wir eine sehr alte Codebasis (geschrieben in den 80ern) beibehalten, wird dieser C89-Code auf diesen Compilern problemlos kompiliert.

Aber ich bin mir nicht sicher, ob es eine gute Idee ist, diese alten Sachen zu verwenden.

Meine Frage ist:

Kann die Verwendung eines alten C-Compilers die Sicherheit des kompilierten Programms beeinträchtigen?

AKTUALISIEREN:

Der gleiche Code wird von Visual Studio 2008 für Windows-Ziele erstellt, und MSVC unterstützt C99 oder C11 noch nicht (ich weiß nicht, ob neuere MSVC dies tun), und ich kann ihn mit dem neuesten GCC auf meiner Linux-Box erstellen. Wenn wir also nur ein neueres GCC einbinden würden, würde es wahrscheinlich genauso gut funktionieren wie zuvor.

Calmarius
quelle
5
Interessante Frage - dies könnte auch eine kurze Lektüre wert sein - developer.slashdot.org/story/13/10/29/2150211/… .. daher können neuere Compiler auch die Sicherheit bei der Optimierung gefährden.
Neil
6
Unterstützen diese alten gcc-Versionen das Kompilieren in PIC / PIE für ASLR? Unterstützen sie Stapelkanarienvögel? W ^ X (NX)? Wenn nicht, ist das Fehlen von Schadensbegrenzungen ein guter Grund für ein Upgrade.
EOF
12
Wenn Sie sich nur die Warnungen von gcc 4.x ansehen, werden Sie möglicherweise sofort eine ganze Reihe vorhandener Sicherheitslücken entdecken, von denen Sie nicht wussten, dass Sie sie hatten.
OrangeDog
7
@OrangeDog: Warum gcc 4.x? gcc6 ist die aktuelle Release-Serie und gcc 5 gibt es schon eine Weile. Aber ja, es -O3 -Wall -Wextra -fsanitize=undefinedsollte helfen , alle Probleme zu beheben, die mit modernem gcc und clang identifiziert wurden .
Peter Cordes
4
@OrangeDog GCC hat Marketing-Versionsnummern verwendet. GCC 5 hat eine größere Versionserhöhung verdient, da sie die Standardstandards C und C ++ sowie das libstdc ++ ABI geändert haben. GCC 6 hätte 5.1 heißen sollen.
zwol

Antworten:

102

Eigentlich würde ich das Gegenteil argumentieren.

Es gibt eine Reihe von Fällen, in denen das Verhalten nicht durch den C-Standard definiert ist, aber es offensichtlich ist, was mit einem "dummen Compiler" auf einer bestimmten Plattform passieren würde. Fälle wie das Überlaufenlassen einer vorzeichenbehafteten Ganzzahl oder der Zugriff auf denselben Speicher über Variablen zweier verschiedener Typen.

Neuere Versionen von gcc (und clang) haben begonnen, diese Fälle als Optimierungsmöglichkeiten zu behandeln, die sich nicht darum kümmern, wenn sie das Verhalten der Binärdatei im Zustand "undefiniertes Verhalten" ändern. Dies ist sehr schlecht, wenn Ihre Codebasis von Personen geschrieben wurde, die C wie einen "tragbaren Assembler" behandelten. Im Laufe der Zeit haben die Optimierer begonnen, bei diesen Optimierungen immer größere Codestücke zu untersuchen, was die Wahrscheinlichkeit erhöht, dass die Binärdatei etwas anderes tut als "was eine von einem dummen Compiler erstellte Binärdatei" tun würde.

Es gibt Compiler-Schalter, um das "traditionelle" Verhalten wiederherzustellen (-fwrapv und -fno-strict-aliasing für die beiden oben genannten), aber zuerst müssen Sie sie kennen.

Während im Prinzip ein Compiler-Fehler konformen Code in eine Sicherheitslücke verwandeln könnte, würde ich das Risiko dafür im großen Schema der Dinge als vernachlässigbar betrachten.

Plugwash
quelle
13
Dieses Argument funktioniert jedoch in beide Richtungen. Wenn ein Compiler ein vorhersehbares "undefiniertes Verhalten" hat, kann es wohl einfacher sein, es böswillig zu verwenden ...
André
18
@Andre Der kompilierte Code weist ohnehin ein vorhersehbares undefiniertes Verhalten auf. Das heißt, sobald der Code kompiliert wurde, ist jedes unvorhersehbare Verhalten in dieser bestimmten kompilierten Version vorhersehbar.
user253751
6
people who treated C like a "portable assembler"ist es nicht was C ist?
Max
10
@Max Diese Antwort warnt genau davor, dass der Begriff "tragbarer Assembler" aufgrund moderner Optimierer in der Praxis zumindest veraltet ist. Und ich würde argumentieren, dass es von Anfang an konzeptionell nie richtig war.
Theodoros Chatzigiannakis
6
Keine Sympathie für diejenigen, die sich auf undefiniertes Verhalten verlassen und später anfangen zu ernten, was sie gesät haben. Dies bedeutet nicht, dass neuere Compiler von Natur aus weniger sicher sind - es bedeutet, dass der nicht konforme Code eine Zeitbombe war. Die Schuld sollte entsprechend aufgeteilt werden.
underscore_d
52

In beiden Vorgehensweisen bestehen Risiken.


Ältere Compiler haben den Vorteil der Reife, und was auch immer in ihnen kaputt war, wurde wahrscheinlich (aber es gibt keine Garantie) erfolgreich umgangen.

In diesem Fall ist ein neuer Compiler eine potenzielle Quelle für neue Fehler.


Auf der anderen Seite verfügen neuere Compiler über zusätzliche Tools :

  • GCC und Clang verfügen jetzt beide über Desinfektionsmittel, mit denen die Laufzeit undefinierte Verhaltensweisen verschiedener Art erkennen kann (Chandler Carruth vom Google Compiler-Team gab im vergangenen Jahr an, dass er erwartet, dass sie die vollständige Abdeckung erreicht haben).
  • Zumindest Clang bietet Funktionen zum Härten . Bei Control Flow Integrity geht es beispielsweise um das Erkennen von Hi-Jacks des Kontrollflusses. Außerdem gibt es Härtungsgeräte zum Schutz vor Stack-Smashing-Angriffen (durch Trennen des Control-Flow-Teils des Stacks vom Datenteil). ;; Härtungsfunktionen sind im Allgemeinen ein geringer Overhead (<1% CPU-Overhead)
  • Clang / LLVM arbeitet auch an libFuzzer , einem Tool zum Erstellen instrumentierter Fuzzing-Unit-Tests, die den Eingaberaum der zu testenden Funktion intelligent untersuchen (indem die Eingabe so angepasst wird, dass noch nicht untersuchte Ausführungspfade verwendet werden).

Das Instrumentieren Ihrer Binärdatei mit den Desinfektionsprogrammen (Address Sanitizer, Memory Sanitizer oder Undefined Behavior Sanitizer) und das anschließende Fuzzing ( z. B. mit American Fuzzy Lop ) hat Schwachstellen in einer Reihe hochkarätiger Software aufgedeckt, siehe beispielsweise diesen LWN.net-Artikel .

Auf diese neuen Tools und alle zukünftigen Tools kann nur zugegriffen werden, wenn Sie Ihren Compiler aktualisieren.

Wenn Sie auf einem Compiler mit geringer Leistung bleiben, stecken Sie Ihren Kopf in den Sand und drücken die Daumen, damit keine Sicherheitslücke gefunden wird. Wenn Ihr Produkt ein hochwertiges Ziel ist, fordere ich Sie auf, es sich noch einmal zu überlegen.


Hinweis: Selbst wenn Sie den Produktions-Compiler NICHT aktualisieren, möchten Sie möglicherweise trotzdem einen neuen Compiler verwenden, um nach Sicherheitslücken zu suchen. Beachten Sie jedoch, dass die Garantien verringert werden, da es sich um unterschiedliche Compiler handelt.

Matthieu M.
quelle
1
+1 für die Mühe, Fälle zu erwähnen, in denen neue Compiler sicherer sein können, anstatt sich auf den "b-aber mein guter alter UB" -Bandwagon der anderen Antworten zu stapeln. Dies kommt zu den vielen anderen Verbesserungen hinzu, die nicht direkt mit der Sicherheit zusammenhängen, sondern noch mehr Impulse geben, um vernünftig modern zu sein.
underscore_d
Obwohl es sich anfühlt, als würde man "Sicherheit durch Dunkelheit" befürworten; Die Fehler, die alte Compiler betreffen, sind bekannt und öffentlich. Obwohl ich damit einverstanden bin, dass neue Compiler Fehler einführen, sind diese Fehler noch nicht öffentlich wie die für frühere Versionen. Dies ist eine gewisse Sicherheit, wenn Sie die Anwendung häufig aktualisieren.
The6P4C
Chandler Carruth ist so süß und spricht von so wunderbaren Dingen. Ich würde ihn heiraten, wenn ich könnte.
Daniel Kamil Kozar
46

Ihr kompilierter Code enthält Fehler, die ausgenutzt werden könnten. Die Fehler stammen aus drei Quellen: Fehler in Ihrem Quellcode, Fehler im Compiler und in den Bibliotheken und undefiniertes Verhalten in Ihrem Quellcode, das der Compiler in einen Fehler verwandelt. (Undefiniertes Verhalten ist ein Fehler, aber noch kein Fehler im kompilierten Code. Als Beispiel ist i = i ++; in C oder C ++ ist es ein Fehler, aber in Ihrem kompilierten Code kann es i um 1 erhöhen und in Ordnung sein oder gesetzt werden Ich zu etwas Müll und ein Käfer sein).

Die Fehlerrate in Ihrem kompilierten Code ist vermutlich aufgrund von Tests und der Behebung von Fehlern aufgrund von Kundenfehlerberichten niedrig. Es mag also anfangs eine große Anzahl von Fehlern gegeben haben, aber das ist gesunken.

Wenn Sie auf einen neueren Compiler aktualisieren, können Sie Fehler verlieren, die durch Compiler-Fehler verursacht wurden. Aber diese Fehler wären alle Fehler, die Ihrer Kenntnis nach niemand gefunden und ausgenutzt hat. Der neue Compiler kann jedoch selbst Fehler aufweisen, und vor allem neuere Compiler neigen stärker dazu, undefiniertes Verhalten in Fehler im kompilierten Code umzuwandeln.

Sie werden also eine Menge neuer Fehler in Ihrem kompilierten Code haben. Alle Fehler, die Hacker finden und ausnutzen konnten. Und wenn Sie nicht viele Tests durchführen und Ihren Code den Kunden überlassen, um Fehler für lange Zeit zu finden, ist er weniger sicher.

gnasher729
quelle
6
Mit anderen Worten ... es gibt keine einfache Möglichkeit zu erkennen, welche Probleme der Compiler verursacht, und wenn Sie nur wechseln, erhalten Sie eine andere Reihe unbekannter Probleme?
Jeremy Kato
1
@JeremyKato: Nun, es gibt einige Fälle, in denen Sie auch andere bekannte Probleme bekommen. Ich bin mir nicht sicher, welche bekannten Sicherheitslücken im Compiler selbst vorhanden sind, aber um ein konkretes Beispiel zu nennen, nehmen wir an, dass ein Update auf einen neuen Compiler auch die Verwendung der neuesten libc bedeutet (während die Verwendung der alten bedeutet, dass dies nicht möglich ist Um dies zu tun, wissen Sie, dass Sie diesen Fehler beheben in getaddrinfo(): access.redhat.com/articles/2161461 . Dieses Beispiel ist eigentlich keine Sicherheitslücke des Compilers, aber über 10 Jahre hinweg müssen einige bekannte Fehler behoben sein.
Steve Jessop
2
Heh, eigentlich wurde dieser Fehler erst 2008 eingeführt, damit der Fragesteller sicher ist. Bei meinem Punkt geht es jedoch nicht um dieses spezielle Beispiel, sondern darum, dass es bekannte Fehler gibt, die eine alte Toolchain in Ihren Code einfügt. Wenn Sie also aktualisieren, ist es wahr, dass Sie eine neue Reihe von Unbekannten einführen, aber das ist nicht alles, was Sie tun . Sie müssen im Grunde nur raten, ob Sie "sicherer" sind, wenn Sie den bekannten kritischen Fehler, den die neueste Toolchain behebt, belassen oder die unbekannten Konsequenzen eines erneuten Würfelns auf das gesamte undefinierte Verhalten in Ihrem eigenen Code ziehen.
Steve Jessop
19

Wenn es nicht kaputt ist, reparieren Sie es nicht

Ihr Chef klingt richtig, wenn er dies sagt. Der wichtigere Faktor ist jedoch die Sicherung von Ein- und Ausgängen sowie Pufferüberläufen. Das Fehlen dieser ist aus dieser Sicht immer das schwächste Glied in der Kette, unabhängig vom verwendeten Compiler.

Wenn die Codebasis jedoch uralt ist und Anstrengungen unternommen wurden, um die Schwächen des verwendeten K & R C zu verringern, wie z. B. mangelnde Typensicherheit, unsichere Geräte usw., wird die Frage abgewogen, ob der Compiler auf ein moderneres C99 aktualisiert werden soll / C11-Standards brechen alles? "

Vorausgesetzt, dass es einen klaren Weg für die Migration zu den neueren C-Standards gibt, der Nebenwirkungen hervorrufen kann, ist es möglicherweise am besten, eine Abzweigung der alten Codebasis zu versuchen, diese zu bewerten und zusätzliche Typprüfungen und Sanitätsprüfungen durchzuführen und festzustellen, ob ein Upgrade auf durchgeführt wird Der neuere Compiler hat Auswirkungen auf Eingabe- / Ausgabedatensätze.

Dann können Sie es Ihrem Chef zeigen: " Hier ist die aktualisierte Codebasis, überarbeitet, mehr im Einklang mit den branchenüblichen C99 / C11-Standards ... ".

Das ist das Glücksspiel , das auf abgewogen werden müssten, sehr sorgfältig , resistence Änderungen in dieser Umgebung kann es zeigen und sich weigern , kann die neueren Sachen zu berühren.

BEARBEITEN

Ich habe mich nur ein paar Minuten zurückgelehnt und festgestellt, dass K & R generierter Code auf einer 16-Bit-Plattform ausgeführt werden kann. Die Wahrscheinlichkeit besteht, dass ein Upgrade auf einen moderneren Compiler tatsächlich die Codebasis sprengt. Ich denke in Bezug auf die Architektur, dass 32-Bit-Code generiert wird Dies könnte lustige Nebenwirkungen auf die Strukturen haben, die für Eingabe- / Ausgabedatensätze verwendet werden. Dies ist ein weiterer wichtiger Faktor, der sorgfältig abgewogen werden muss.

Da OP die Verwendung von Visual Studio 2008 zum Erstellen der Codebasis erwähnt hat, kann die Verwendung von gcc dazu führen, dass entweder MinGW oder Cygwin in die Umgebung gebracht werden, was sich auf die Umgebung auswirken kann, es sei denn, das Ziel ist Linux einen Versuch wert, muss möglicherweise zusätzliche Schalter zum Compiler enthalten, um das Rauschen auf der alten K & R-Codebasis zu minimieren. Die andere wichtige Sache ist, viele Tests durchzuführen, um sicherzustellen, dass keine Funktionalität beeinträchtigt wird. Dies kann sich als schmerzhafte Übung herausstellen.

t0mm13b
quelle
Der gleiche Code wird von Visual Studio 2008 für Windows-Ziele erstellt, und MSVC unterstützt C99 oder C11 noch nicht (ich weiß nicht, ob neuere MSVC dies tun), und ich kann ihn mit dem neuesten GCC auf meiner Linux-Box erstellen. Wenn wir also nur ein neueres GCC einbauen würden, würde es wahrscheinlich genauso gut funktionieren wie zuvor.
Calmarius
@ Calmarius danke für das Heads-up, vielleicht ist es am besten, Ihre Frage zu bearbeiten, um den Kommentar aufzunehmen, das ist wichtig :) Und hätte da sein sollen; D
t0mm13b
@Calmarius hat meine Antwort bearbeitet, was meine Meinung zu der neu aktualisierten Frage ist.
t0mm13b
2
"Könnte auf einer 16-Bit-Plattform laufen, die Chancen stehen gut, dass ein Upgrade auf einen moderneren Compiler tatsächlich die Codebasis sprengen könnte. Ich denke in Bezug auf Architektur, 32-Bit-Code." Ich glaube nicht, dass es um die Portierung von Code auf eine neue Implementierung geht Parameter.
Pascal Cuoq
Einverstanden. Es ist möglich, dass eine Laufzeit-Sicherheitsanfälligkeit durch einen Compiler-Fehler verursacht wird. Es ist jedoch weitaus wahrscheinlicher, dass der Code Laufzeitschwachstellen enthält, die auf Puffer- und Stapelüberschreitungen zurückzuführen sind. Wenn Sie also Zeit investieren, um diese Codebasis sicherer zu machen, sollten Sie sie beispielsweise in die Überprüfung der Länge von Eingabezeichenfolgen investieren, um sicherzustellen, dass sie die Grenzen Ihres Programms nicht überschreiten. Ein neuerer Compiler hilft nicht viel. Das Umschreiben des Codes von Grund auf in einer Sprache mit nativen String- und Array-Objekten hilft sehr. Aber Ihr Chef wird das nicht bezahlen.
O. Jones
9

Kann die Verwendung eines alten C-Compilers die Sicherheit des kompilierten Programms beeinträchtigen?

Natürlich kann es sein, wenn der alte Compiler bekannte Fehler enthält, von denen Sie wissen, dass sie Ihr Programm beeinflussen würden.

Die Frage ist, oder? Um sicher zu sein, müssten Sie das gesamte Änderungsprotokoll von Ihrer Version bis zum aktuellen Datum lesen und jeden einzelnen Fehler überprüfen, der im Laufe der Jahre behoben wurde.

Wenn Sie keine Hinweise auf Compiler-Fehler finden, die sich auf Ihr Programm auswirken könnten, erscheint die Aktualisierung von GCC nur aus diesem Grund etwas paranoid. Sie müssen bedenken, dass neuere Versionen möglicherweise neue Fehler enthalten, die noch nicht entdeckt wurden. In letzter Zeit wurden viele Änderungen mit Unterstützung von GCC 5 und C11 vorgenommen.

Abgesehen davon ist der in den 80er Jahren geschriebene Code höchstwahrscheinlich bereits randvoll mit Sicherheitslücken und dem Vertrauen in schlecht definiertes Verhalten, unabhängig vom Compiler. Wir sprechen hier von Pre-Standard C.

Lundin
quelle
6
Ich denke nicht, dass es Paranoia ist; Ich denke, das OP versucht Gründe zu erfinden, um seinen Chef zu überzeugen. Wahrscheinlich möchte das OP tatsächlich einen neuen Compiler, weil sie einen besseren Asm (einschließlich dateiübergreifender Optimierung mit LTO) bieten, nützlichere Diagnosen / Warnungen haben und moderne Sprachfunktionen und -syntax ermöglichen. (zB C11 stdatomic).
Peter Cordes
9

Es besteht ein Sicherheitsrisiko, bei dem ein böswilliger Entwickler eine Hintertür durch einen Compiler-Fehler schleichen kann. Abhängig von der Anzahl der bekannten Fehler im verwendeten Compiler kann die Hintertür mehr oder weniger unauffällig aussehen (in jedem Fall ist der Punkt, dass der Code auf Quellenebene korrekt ist, auch wenn er verschlungen ist. Quellcode überprüft und testet mit Ein nicht fehlerhafter Compiler findet die Hintertür nicht, da die Hintertür unter diesen Bedingungen nicht vorhanden ist. Für zusätzliche Verleugnungspunkte kann der böswillige Entwickler auch selbst nach bisher unbekannten Compiler-Fehlern suchen. Auch hier hängt die Qualität der Tarnung von der Auswahl der gefundenen Compiler-Fehler ab.

Dieser Angriff wird im Programm sudo in diesem Artikel dargestellt . bcrypt hat ein großartiges Follow-up für Javascript-Minifier geschrieben .

Abgesehen von dieser Sorge hat sich die Entwicklung von C - Compiler wurden nicht definiertes Verhalten zu nutzen mehr und mehr und mehr aggressiv, so alt C - Code, der in gutem Glauben geschrieben wurde eigentlich mehr wäre mit einem C - Compiler aus der Zeit zusammengestellt sicher oder kompiliert bei -O0 (aber einige neue programmbrechende UB-Exploiting-Optimierungen werden in neuen Versionen von Compilern sogar bei -O0 eingeführt ).

Pascal Cuoq
quelle
7

Ältere Compiler sind möglicherweise nicht vor bekannten Hacking-Angriffen geschützt. Beispielsweise wurde der Stapelschlagschutz erst mit GCC 4.1 eingeführt . Also ja, mit älteren Compilern kompilierter Code kann auf eine Weise anfällig sein, vor der neuere Compiler schützen.

DrMcCleod
quelle
6

Ein weiterer Aspekt, über den Sie sich Sorgen machen müssen, ist die Entwicklung neuen Codes .

Ältere Compiler verhalten sich bei einigen Sprachfunktionen möglicherweise anders als vom Programmierer standardisiert und erwartet. Diese Nichtübereinstimmung kann die Entwicklung verlangsamen und subtile Fehler verursachen, die ausgenutzt werden können.

Ältere Compiler bieten weniger Funktionen (einschließlich Sprachfunktionen!) Und optimieren auch nicht. Programmierer werden sich um diese Mängel herum hacken - z. B. indem sie fehlende Funktionen neu implementieren oder cleveren Code schreiben, der dunkel ist, aber schneller ausgeführt wird - und neue Möglichkeiten für die Erstellung subtiler Fehler schaffen.


quelle
5

Nee

Der Grund ist einfach: Der alte Compiler weist möglicherweise alte Fehler und Exploits auf, der neue Compiler weist jedoch neue Fehler und Exploits auf.

Sie "beheben" keine Fehler, indem Sie auf einen neuen Compiler aktualisieren. Sie tauschen alte Fehler und Exploits gegen neue Fehler und Exploits aus.

coteyr
quelle
3
Diese scheinen sehr simpel zu sein: Der neue Compiler hat möglicherweise seine Schwächen, aber ich würde erwarten, dass sie geringer sind als im alten Compiler, und es ist wahrscheinlich, dass er mehrere Code-Schwachstellen entdeckt, die seitdem bekannt geworden sind.
PJTraill
Der neue Compiler weist jedoch möglicherweise unbekannte neue Schwächen auf. Der Compiler allein ist kein Sicherheitsrisiko, das aktualisiert werden muss. Sie reduzieren nicht Ihre Oberfläche. Sie tauschen einen bekannten Satz von Problemen gegen einen unbekannten Satz.
Coteyr
Die Tools zum Auffinden von Fehlern haben sich seit den Anfängen des GCC enorm verbessert, und diese Tools (statische Analyse, dynamische Analyse des instrumentierten Codes / Desinfektionsmittel, Fuzzers usw.) wurden auch auf den Compiler-Code angewendet, um die Qualität zu verbessern. In der GCC 2-Ära war es viel schwieriger, alle Fehlerklassen zu finden. Vergleich von Compiler-Fehlern mit Versionen - siehe Seite 7: cs.utah.edu/~regehr/papers/pldi11-preprint.pdf GCC 4.5 und LLVM 2.8 (aktuell bei Veröffentlichung) weisen die wenigsten Fehler durch Fuzzing auf.
Jetski S-Typ
2

Nun, es besteht eine höhere Wahrscheinlichkeit, dass Fehler im alten Compiler bekannt und dokumentiert sind, anstatt einen neuen Compiler zu verwenden, sodass Maßnahmen ergriffen werden können, um diese Fehler durch Codierung zu vermeiden. Auf eine Weise, die als Argument für ein Upgrade nicht ausreicht. Wir haben die gleichen Diskussionen, in denen ich arbeite, wir verwenden GCC 4.6.1 auf einer Codebasis für eingebettete Software und es gibt eine große Zurückhaltung (unter den Managern), auf den neuesten Compiler zu aktualisieren, weil wir Angst vor neuen, nicht dokumentierten Fehlern haben.

AndersK
quelle
0

Ihre Frage besteht aus zwei Teilen:

  • Explizit: „Besteht ein größeres Risiko bei der Verwendung des älteren Compilers?“ (Mehr oder weniger wie in Ihrem Titel)
  • Implizit: "Wie kann ich das Management zum Upgrade überreden?"

Vielleicht können Sie beides beantworten, indem Sie einen ausnutzbaren Fehler in Ihrer vorhandenen Codebasis finden und zeigen, dass ein neuerer Compiler ihn erkannt hätte. Natürlich kann Ihr Management sagen, dass Sie das mit dem alten Compiler gefunden haben, aber Sie können darauf hinweisen, dass es einen erheblichen Aufwand gekostet hat. Oder Sie führen es durch den neuen Compiler, um die Sicherheitsanfälligkeit zu finden, und nutzen es dann aus, wenn Sie den Code mit dem neuen Compiler kompilieren können / dürfen. Sie möchten vielleicht Hilfe von einem freundlichen Hacker, aber das hängt davon ab, ob Sie ihnen vertrauen und in der Lage / erlaubt sind, ihnen den Code anzuzeigen (und den neuen Compiler zu verwenden).

Wenn Ihr System jedoch keinen Hackern ausgesetzt ist, sollten Sie sich vielleicht mehr dafür interessieren, ob ein Compiler-Upgrade Ihre Effektivität erhöht: MSVS 2013 Code Analysis findet potenzielle Fehler häufig viel früher als MSVS 2010 und unterstützt mehr oder weniger C99 / C11 - forIch bin mir nicht sicher, ob dies offiziell der Fall ist, aber Deklarationen können Anweisungen folgen und Sie können Variablen in -loops deklarieren.

PJTraill
quelle