Schiene fehlschlägt auf Code, der Komplex enthält.
-
01-10-2019 - |
Frage
Ich versuche zu rennen splint
auf einer C -Quelle, die enthält complex.h
aus der Standard -C -Bibliothek zur Unterstützung komplexer Arithmetik.
Leider, splint
fällt mit dem folgenden Fehler fehl.
Schiene 3.1.2 --- 03. Mai 2009
/usr/include/bits/cmathcalls.h:54:31: Parse ERROR: Nicht-Funktionserklärung: _komplex: externes Doppel. (Für Hilfe bei analysierenden Fehlern siehe Splint -Help Parseerrors.) *** kann nicht fortgesetzt werden.
Das Googeln nach dem Problem führte nur dazu diese Nachricht Auf der Versandliste mit Split-Discuss-Mailing (die unbeantwortet bleibt).
Irgendwelche Ideen?
Aktualisieren
Hier ist ein sehr einfaches Beispiel für eine fehlgeschlagene Quelle:
#include <complex.h>
int main() {
complex x = 2 + 8i;
x = x + 1;
}
Versuche, die nicht unterstützten Neue zu definieren _Complex
C99 Schlüsselwort führt zu einem Fehler mit dem imaginären Teil der komplexen Zahl (was nicht überraschend ist).
lsc@deepthought:~$ splint-D_Complex=double temp.c
Splint 3.1.2 --- 03 May 2009
temp.c:4:20: Parse Error. (For help on
parse errors, see splint -help
parseerrors.)
*** Cannot continue.
Lösung 3
Ich habe dies schließlich gelöst, indem ich vorübergehend überschrieben habe complex.h
mit einem Dummy, wenn Sie anrufen splint
.
[lsc@home]$ ls /opt/qa_tools/utils/splint_includes/
complex.h
[lsc@home]$ splint -I/opt/qa_tools/utils/splint_includes test.c
Splint 3.1.1 --- 15 Jun 2004
Finished checking --- no warnings
Der Dummy complex.h
Die Datei unterdrückt die relevanten Schlüsselwörter und ersetzt Konstanten/Funktionen durch Dummy. Diese Schlüsselwörter/Konstanten/Funktionen wurden aus stammten die technischen Daten
Eine Kopie dieser Datei ist hier verfügbar: https://gist.github.com/1316366
Andere Tipps
Ich bin kein Schiene -Benutzer, also nehmen Sie Folgendes mit einem Körnchen Salz ...
Das _Complex
Das Schlüsselwort wurde mit C99 hinzugefügt, und die FAQ der Schiene hat dies zu C99 zu sagen (http://www.splint.org/faq.html#quest15):
Splint unterstützt jedoch noch nicht alle C99 -Erweiterungen, daher gibt es einige legitime C -Programme, die geändert werden müssen.
Ich würde das erraten _Complex
ist von dieser Einschränkung bedeckt.
Möglicherweise können Sie Spints offensichtliche Mangel an Unterstützung für die Unterstützung für _Complex
unter Verwendung einer in den FAQ beschriebenen Technik (http://www.splint.org/faq.html#quest14), aber ich wäre überrascht, wenn dies Sie sehr weit gebracht hat, wenn Sie den Schild mit C99 -Code verwenden. _Complex
:
Wenn Sie nur ein Schlüsselwort ignorieren möchten, können Sie hinzufügen
-Dnonstandardkeyword=
Damit den Präprozessor das Schlüsselwort beseitigt, wononstandardkeyword
ist der Name des Schlüsselworts.
Ich hatte Mühe, Schiene zu bekommen, um Header zu ignorieren und nirgendwo online geeignete Antworten zu finden. Ich habe schließlich die integrierte Hilfe von Spint verwendet und Folgendes entdeckt:
#ifndef S_SPLINT_S #endif
Wenn Sie dieses Paar um den Code legen, den Sie ignorieren möchten, wird es es ignorieren! Keines der anderen Dinge funktioniert für System -Header -Dateien, zumindest das, was ich gefunden habe.