Kostenloser statischer Checker für C99-Code

Lesezeit: 6 Minuten

Benutzer-Avatar
dezent

Ich suche nach einem kostenlosen statischen Prüfer für C99-Code (einschließlich GCC-Erweiterungen) mit der Fähigkeit, explizit zu sagen: “Diese Präprozessormakros sind immer definiert.”

Ich brauche diesen letzten Teil, weil ich eingebetteten Code für einen einzelnen Zielprozessor kompiliere. Der Compiler (C32 von Microchip, GCC-basiert) setzt ein Makro basierend auf dem ausgewählten Prozessor, das dann in den PIC32-Header-Dateien verwendet wird, um eine einzuschließende prozessorspezifische Header-Datei auszuwählen. cppcheck schlägt daher fehl, weil es die 30 anders erkennt #ifdefs verwendet, um einen der vielen möglichen PIC32-Prozessoren auszuwählen, versucht, alle möglichen Kombinationen dieser plus aller anderen zu analysieren #defines und scheitert.

Zum Beispiel, wenn Schiene C99-Code verarbeiten könnte, würde ich verwenden

splint -D__PIC32_FEATURE_SET__=460 -D__32MX460F512L__ \
-D__LANGUAGE_C__ -I/path/to/my/includes source.c

Ein zusätzliches Problem ist, dass der PIC32-Toolchain-Compiler aufgerufen wird pic32-gcc und nicht nur gccobwohl ich noch nicht an dem Punkt angelangt bin, an dem ich dies berücksichtigen muss.

Update Nr. 1 – Eine Sache, die mich interessiert, aber orthogonal zu dieser Frage ist, ist die Eclipse-Integration (es wäre schön, kein Makefile für mehr als 30 Kompilierungseinheiten schreiben zu müssen). Ich fragte danach auf der Eclipse-Foren (obwohl die Diskussion dort mehr über die Integration in Eclipse geht). Nichts Bahnbrechendes.

Update Nr. 2 – gerade versucht scan-build aus klirrenmit:

scan-build --use-cc=/usr/local/bin/pic32-gcc make -B -k all

…(auch ohne die --use-cc Flag), aber alles, was ich bekam, war die typische Build-Ausgabe, ein Beispiel dafür ist:

Building file: ../src/MoreMath.c
Invoking: PIC C32 C Compiler
pic32-gcc -D__DEBUG -I/usr/local/pic32-libs/include -O0 -Wall -c -fmessage-length=0 -std=gnu99 -Werror-implicit-function-declaration -MMD -MP -MF"src/MoreMath.d" -MT"src/MoreMath.d" -mprocessor=32MX460F512L -D__DEBUG -g -o"src/MoreMath.o" "../src/MoreMath.c"
Finished building: ../src/MoreMath.c

…und am Ende:

Building target: MyBinary.elf
Invoking: PIC C32 C Linker
pic32-gcc -Wl,-Map,MyBinary.map -mprocessor=32MX460F512L --defsym=__MPLAB_DEBUG=1 -o"MyBinary.elf" <<ALL OF MY *.o FILES HERE>>
Finished building target: MyBinary.elf

scan-build: Removing directory '/tmp/scan-build-2010-06-21-1' because it contains no reports.

Also entweder mein Code ist perfekt nach scan-build, oder es tut nichts. Ich bin mir nicht sicher, was ein guter Test sein könnte, um zu sehen, ob es funktioniert.

  • Sie sollten Ihrer Frage Ihre Bestimmung hinzufügen, die in Eclipse verwendet werden soll, wenn dies tatsächlich eine Anforderung für Ihre Lösung ist.

    – mbauman

    21. Juni 2010 um 1:37 Uhr

  • Nein, es wäre ein zusätzlicher Bonus. Ich werde die Frage bearbeiten, um das klarer zu machen. Ich arbeite immer noch daran, es zu bekommen scan-build mit der PIC32-Toolchain zu arbeiten, und wenn ich das tue, akzeptiere ich die Antwort unten.

    – dezent

    21. Juni 2010 um 1:52 Uhr

  • @Adam Davis – Ich wollte die Frage optimieren, um meine Verwendung der PIC32-Toolchain besser hervorzuheben, aber ich weiß nicht, ob dies Ihre Motivation zum Aufstellen eines Kopfgeldes beeinträchtigen wird. Sag Bescheid, wenn ich warten soll.

    – dezent

    21. Juni 2010 um 4:58 Uhr

  • Hallo, ich möchte keine Off-Topic-Frage stellen, aber ich bin sehr neugierig. Warum sollte jemand einen Mikrochip programmieren wollen? Was baust du? Vielen Dank..

    – der Mechaniker_

    27. Juni 2010 um 23:46 Uhr

  • Der Mikrochip ist Teil des Steuersystems einiger elektronischer Geräte. Sie sind fast vollständig automatisch, sodass die Bedingungen über integrierte Sensoren (und die wenigen Eingänge) überwacht und verschiedene Peripheriegeräte angepasst werden, um bestimmte Betriebszustände aufrechtzuerhalten.

    – dezent

    28. Juni 2010 um 0:16 Uhr

Clangs statischer Analysator sollte arbeiten.

Eine weitere Option mit dem Quellcode #defines ist, dass du rennen könntest cpp über den Quellcode mit einigen der Präprozessoranweisungen und führen Sie diesen resultierenden Code dann durch einen statischen Analysator.

  • Ich finde scan-build ist ungefähr so ​​gut wie ich bekommen kann. Ich entwickle unter Eclipse und verwende den internen Builder (dh kein explizites Makefile), und ich glaube nicht, dass es eine Clang-Integration für das Eclipse-CDT gibt. Es könnte sich lohnen, zu einem Makefile-basierten Projekt zu wechseln.

    – dezent

    27. April 2010 um 5:00 Uhr

  • Leider sehe ich keinen Weg, um zu kommen scan-build (oder andere Clang-Tools), um mit Eclipse zu arbeiten.

    – dezent

    10. Juni 2010 um 2:44 Uhr

  • @detly: Warum um alles in der Welt ist ein erfahrener C-Programmierer wie Sie an eine gottlose Abscheulichkeit wie Eclipse gebunden?

    – Matt Tischler

    19. November 2010 um 16:29 Uhr

  • @Matt Joiner – was würdest du empfehlen? (Außerdem glaube ich, dass es in diesem Fall nicht Eclipse war, sondern dass Scan-Build einfach nicht so funktioniert hat, wie ich es erwartet hatte.)

    – dezent

    21. November 2010 um 2:28 Uhr

  • stackoverflow.com/questions/3528079/…

    – Matt Tischler

    21. November 2010 um 4:04 Uhr

Sie könnten einfach einen Code wie diesen oben in Ihren Header einfügen, der garantiert, dass er definiert ist:

#ifndef MACRO_I_NEED
#error "MACRO_I_NEED should be defined"
#define MACRO_I_NEED  // to appease cppcheck
#endif

  • Müsste ich das nicht für jede einzelne Quelldatei tun?

    – dezent

    27. April 2010 um 4:11 Uhr

  • @detly: Nicht unbedingt – wenn Sie eine Header-Datei haben, die jede Datei enthält (z. B. einen vorkompilierten Header), können Sie sie ganz oben platzieren.

    – Adam Rosenfield

    27. April 2010 um 18:18 Uhr

Anstatt scan-build mit clang zu verwenden, sollten Sie gcc komplett austauschen! Die C-Unterstützung von Clang ist stabil (und tut ihr Bestes, um gcc zu emulieren) und sollte Ihren Code gut verarbeiten.

Versuchen Sie so etwas wie make -j3 CC=clang und schau was passiert!

PS. Diese Syntax könnte völlig falsch sein. Habe seit Ewigkeiten keine Makefiles mehr verwendet (CMake ist übrigens erstaunlich).

  • Es unterstützt nicht die -MT Option, was bedeutet, dass ich viele Makefiles neu schreiben muss. Derzeit verwendet der Build Autodependency-Dateien – .d Dateien – die jeweils die Header-Abhängigkeiten enthalten .o Datei. Bis ich das testen kann, wird es noch dauern.

    – dezent

    28. Juni 2010 um 2:56 Uhr

  • @detly, generieren Sie die Abhängigkeitsdateien und schneiden Sie ihre Handhabung (meistens Vorlagen, nehme ich an) in Ihrem Makefile aus)?

    – Vonbrand

    2. Februar 2013 um 19:45 Uhr

Je nachdem, welche tatsächlichen Analysen Sie für Ihren Code ausführen möchten, können Sie einen Blick darauf werfen Frama-C. Es verwendet den C-Präprozessor, den Sie ihm mitteilen, sodass Sie das CPP von PIC32 verwenden können, wenn Sie möchten.

Dies gibt Ihnen möglicherweise nicht direkt die Lösung, aber Sie könnten einen Blick auf Coverity werfen, einen proprietären statischen Syntaxanalysator, der jedoch für Betriebssystemprojekte kostenlos ist. Es sollte die Arbeit in Bezug auf Ihre Bedürfnisse erledigen!

Prost!

Benutzer-Avatar
Geoff Reedy

Sie können ein Tool wie verwenden sunifdef um den Quellcode gemäß den angenommenen definierten Makros teilweise vorzuverarbeiten. Sie müssten Kopien von System- und Bibliotheksheadern erstellen, die von diesen Definitionen betroffen sind, und sie ebenfalls verarbeiten. Dann würden Sie bei der statischen Analyse einen anderen Include-Pfad angeben, der auf Ihre bereits verarbeiteten Header zeigt.

1101400cookie-checkKostenloser statischer Checker für C99-Code

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy