2016-05-09 7 views
2

Ein Compiler erzwingt Regeln der Syntax. Was ich will, ist ein semantischer Compiler oder eine semantische Stufe auf einem normalen Compiler.Kompilierzeit-Durchsetzung von semantischen Regeln

Ich bin mir nicht sicher, der beste Weg, um darüber zu gehen. Einige Sprachen Mai haben direkte Mittel, einige Sprachen können Ihnen erlauben, Dinge wie Vorlagen zu "missbrauchen", schließlich, Clang erlaubt sehr leistungsfähige AST-Generation. Aber mir sind keine Werkzeuge bekannt, die es benutzen, um willkürliche Regeln durchzusetzen.

Ich bin auf der Suche nach einer leistungsstarken statischen, (Kompilierzeit) "Kontext" Checker.

Zum Beispiel: Ich möchte sicherstellen (mit einer Kompilierzeit Warnung oder Fehlermeldung), dass der Rückgabewert einer bestimmten Funktion ausgewertet wurde. Ziemlich einfach, und die hilfsbereiten Leute in den D-Foren haben einen Beispielcode zur Verfügung gestellt.

Aber was ist mit anderen Regeln? Beispiel: Erzeuge einen Fehler, wenn jemand eine Bibliotheksfunktion vor dem Aufruf einer vorausgesetzten Initialisierungsfunktion aufruft. (*) Sicher, du könntest eine Ausnahme spawnen. Aber sollte es keine elegantere Kompilierzeit, Lösung und System geben, wenn das Problem selbst von Natur aus statisch ist? Oder bin ich reduziert auf "Biegen" Sprachen mit exotischen Vorlage Voodoo zu tun, was ich möchte?

(*) Ja, dieser Fall erfordert möglicherweise einen dynamischen Checker. Aber es hängt vielleicht nicht vom Kontext ab. Wie die Verwendung einer Variablen vor der Initialisierung.

Ich habe einige Code-Checker gesehen, die "Best Practices" scannen. Unterstützt einer von ihnen (die kostenlos sind) benutzerdefinierte Regeln? Und sind sie für den Entwicklungsprozess sehr invasiv? Im Idealfall möchte ich nur "benutzerdefinierte semantische Regeln, die Compilerfehler oder Warnungen erzeugen", wenn ich mein Projekt kompiliere.

p.s. Ich bin mir im Voraus bewusst, dass einige Leute verkünden werden, dass "Code Enforcement" in Code-Richtlinien verbannt werden sollte und dass man Programmierer nicht zwingen kann, Regeln zu folgen. Aber ich frage nicht nach Perfektion. Ich fordere den leitenden Entwickler eines Projekts auf, bestimmte Regeln mit einem Compiler durchsetzen zu können, was andere dazu bringen wird, zu bemerken, wenn diese Regeln verletzt werden.

+0

Können Sie uns ein Beispiel geben, was Sie zu tun versuchen? –

+0

Sie sollten Ihre Bibliotheken so entwerfen, dass sie nicht (einfach) missbraucht werden können. Beispiel: Das Anfordern einer Initialisierungsfunktion ist einfach. Sie legen es in einen Konstruktor. Jetzt können Sie die Methode nicht aufrufen, ohne das Objekt zu erstellen, an dem der Initializer bereits ausgeführt wurde.Beispiel: Rückgabewert einer bestimmten Funktion wurde ausgewertet. Schalten Sie alle Compiler-Warnungen ein, der Compiler wird Ihnen sagen, ob Sie etwas falsch gemacht haben. –

+0

Um sicherzustellen, dass der Rückgabewert verwendet wird, wird C++ 17 wahrscheinlich ein "[[nodiscard]]" Attribut haben. – chris

Antwort

3

Was Sie wollen, ist ein anpassbares Programmanalyse-Tool.

Mein Verständnis ist, dass Clang das tun kann, und ist irgendwie entworfen, um dies relativ einfach zu machen. Sie können Clang anpassen, um beliebige Vergleichselemente für Ihren Code zu implementieren. Sie schreiben diese Anpassungen alle in C++ AFAIK. Clang fungiert auch als Compiler, sodass Sie diese vermutlich in ein einzelnes Clang-Bild integrieren können.

Mein Verständnis, dass Sie dies auch mit GCC tun können, aber es wurde nicht für diesen Zweck entwickelt, so dass dies in der Praxis viel schwieriger ist. GCC MELT soll das erleichtern. IMHO ist es genauso kompliziert wie GCC, also sehe ich nicht, wie das viel hilft. YMMV.

Ein dritter Ansatz besteht darin, ein Tool zu verwenden, das speziell zur Unterstützung solcher Anpassungen entwickelt wurde. Unsere DMS Software Reengineering Toolkit und ihre C++ front end sind diese Art von Werkzeug. Sie können damit semantische Constraints definieren, indem Sie eine Kombination aus source-level pattern matching und beliebigen Prädikaten verwenden, die über Symboltabellenwerte/C++ - Typen und methodenlokale Steuerungs- und Datenflussanalyse codiert sind.

Verwandte Themen