Ich betrachtete frama-c als eine Möglichkeit, C-Header-Dateien in OCaml zu verarbeiten (z. B. zum Generieren von Sprachbindungen). Es ist attraktiv, weil es wie ein sehr gut dokumentiertes und gepflegtes Projekt aussieht. Nach vielem Googeln und Durchsuchen der Dokumentation kann ich jedoch nichts passendes finden. Fehle ich gerade den richtigen Weg, oder ist es außerhalb des Rahmens von frama-c? Es scheint eine ziemlich triviale Sache zu sein, verglichen mit einigen anderen Plugins.Kann frama-c für die Header-Dateianalyse verwendet werden?
Antwort
Wie Pascal gesagt, ich glaube nicht, dass es möglich ist, von der Befehlszeile aus, aber da Sie sowieso etwas Code schreiben müssen, können Sie das Flag Rmtmps.keepUnused
setzen. Dies ist ein Skript, das Sie die Deklarationen verwenden können, um zu sehen:
let main() =
Rmtmps.keepUnused := true;
let file = File.from_filename "t.h" in
let() = File.init_from_c_files [ file ] in
let _ast = Ast.get() in
let show_function f =
let name = Kernel_function.get_name f in
if not (Cil.Builtin_functions.mem name) then
Format.printf "Function @[<2>%a:@ @[@[type: %[email protected]]@ @[%s at %[email protected]]@]@]@."
Kernel_function.pretty f
Cil_datatype.Typ.pretty (Kernel_function.get_type f)
(if Kernel_function.is_definition f then "defined" else "declared")
Cil.d_loc (Kernel_function.get_location f)
in Globals.Functions.iter show_function
let() = Db.Main.extend main
es ausführen zu können, müssen Sie die -load-script
Option wie folgt verwenden:
$ frama-c -load-script script.ml
Entwicklung eines Plug-in wird besser geeignet sein für komplexere Verarbeitung (siehe Entwicklerhandbuch dafür), aber ein Skript macht es einfach zu testen.
danke! hatte Angst, ich müsste auf Frama-c verzichten –
Im aktuellen Zustand würde ich sagen, dass es leider unmöglich ist, Frama-C zu verwenden, um Deklarationen von Funktionen zu analysieren, die weder definiert noch verwendet werden.
t.h:
int mybinding (int x, int y);
Dies gibt Ihnen einen Blick auf das normalisierte AST. Normalized bedeutet, dass alles, was war vereinfacht werden könnte:
$ frama-c -print t.h
[kernel] preprocessing with "gcc -C -E -I. t.h"
/* Generated by Frama-C */
Und leider, da mybinding
weder verwendet noch definiert, es wurde gelöscht.
Es gibt eine Option, Deklarationen mit Spezifikationen zu halten, aber was Sie wollen, ist eine Option, alle Deklarationen zu behalten. Ich habe nie bemerkt, eine solche Option:
$ frama-c -kernel-help
...
-keep-unused-specified-functions keep specified-but-unused functions (set by
default, opposite option is
-remove-unused-specified-functions)
Und die Möglichkeit, Funktionen mit Spezifikationen zu halten nicht, was Sie wollen:
$ frama-c -keep-unused-specified-functions -print t.h
[kernel] preprocessing with "gcc -C -E -I. t.h"
/* Generated by Frama-C */
- 1. Kann Annotationsprozessor für die Codegenerierung verwendet werden?
- 2. Kann ElasticSearch nur für Aggregationen verwendet werden?
- 3. Kann XMLCatalog für Schemaimporte verwendet werden?
- 4. Kann die Stoppuhr im Produktionscode verwendet werden?
- 5. Kann async/await für Konstruktoren verwendet werden?
- 6. PHP: Kann Bereich() für Brüche verwendet werden?
- 7. CanOpenUrl kann nicht für die InterApp-Kommunikation verwendet werden
- 8. Kann Caffe Only ohne Klassifizierung für die Klassifizierung verwendet werden?
- 9. Kann die gleiche sqlcmd.exe für jede Datenbanksicherung verwendet werden
- 10. Eine Variable deklarieren, die für mehrere Formulare verwendet werden kann
- 11. Kann die Bearer-Authentifizierung für Websocket-Upgrade-Anfragen verwendet werden?
- 12. Kann Roslyn für VB.NET Scripting verwendet werden?
- 13. Kann GitHub für Windows lokal verwendet werden?
- 14. Kann ein Typeconverter für Konstruktorargument verwendet werden
- 15. Kann JaaS für den Rest verwendet werden?
- 16. Kann Python für Mac-Skripts verwendet werden?
- 17. Kann die Destrukturierung in Funktionsargumenten verwendet werden?
- 18. Wie kann die clojure.algo.generic-Bibliothek verwendet werden?
- 19. Sollen Ausnahmen für die Formularvalidierung verwendet werden?
- 20. Kann AzMan für die rollenbasierte Autorisierung von Objekten verwendet werden, die zur Laufzeit erstellt werden?
- 21. kann Jailbroken iphone für die Entwicklung verwendet
- 22. Was kann für DateTime :: diff() für PHP 5.2 verwendet werden?
- 23. Kann HttpClient gleichzeitig verwendet werden?
- 24. BitScanForward64 kann nicht verwendet werden
- 25. Ruby kann nicht verwendet werden
- 26. Kann ExecuteReader() zweimal verwendet werden?
- 27. Kann JSONP sicher verwendet werden?
- 28. kann nicht verwendet werden ScalaTest
- 29. ADLivelyTableView kann nicht verwendet werden
- 30. Responsivevoice.js kann offline verwendet werden?
Dies kann cilly Vorschlag sein, da ich nicht sicher bin, was genau es tut, aber könnte [CIL] (http://kerneis.github.com/cil/) Ihnen helfen? –
danke für den Zeiger - wird durch die Cil-Dokumentation stochern und sehen, ob es etwas hilfreiches hat –