2009-03-21 13 views
6

Wissen Sie, wie kann ich Schienen dazu bringen, zu ignorieren, wo ich meine Variablen deklariere?Wie kann ich Schienen dazu bringen, zu ignorieren, wo ich meine Variablen deklariere?

Ich weiß, dass die alte Schule c Sie Variablen direkt am in jeder Funktion beginnt zu erklären, erzählt, aber da ich einen schlechten Mensch bin Ich mag die Dinge zu erklären, die Nähe, wo ich sie verwenden. Ein gutes Beispiel ist es, int i; direkt vor dem für (i = 0; ...).

Nehmen wir ein ganz einfaches Beispiel

#include <stdio.h> 
int main() 
{ 
    printf("Hello splint test\n"); 

    int i; 
    for(i=5;i>0;i--) 
    { 
     printf("%2d...\n",i); 
    } 

    return 0; 
} 

Hier Schiene und die meisten alten c-Compiler möchte int i bewegen; eine Zeile nach oben, oder {} um die Deklaration und die for-Schleife zu legen.

Und nun zur Frage, wie schalte ich diese Prüfung aus? Aber behalten Sie die anderen Überprüfungen, die gut sind?

Dank Johan


Anmerkung 1: Ich verwende bereits gcc Warnungen (siehe unten) als erste Zeile aus Verteidigung, und valgrind als die zweite. Aber ich denke Schiene auf meiner Liste der Dinge, über das Hinzufügen, die meine Dummheit ;-) Aber diese Prüfung steuern könnte, ist nur ärgerlich,

Die gcc Warnungen Ich verwende: -Wall -W -Wextra -Wconversion - Wshadow -Wcast-qual -Write-Strings -Werror

Hinweis 2: Ich weiß über die möglichen Portabilitätsprobleme, die von diesem schlechten Verhalten kommen könnten. Aber ich fühle, dass es die Lesbarkeit erhöht, aka nicht auf und ab springen müssen, um diese Art von Off-Deklarationen zu suchen ist wertvoller (und das können wir in einem anderen Thread diskutieren).


aktualisieren: Etwas mehr Informationen, legte ich den obigen Code in einer Datei namens main.c Plattform verwendet wird, ist Ubuntu 8.04 und gvim als Redakteur, und dies ist die Ausgabe von Schiene, wenn ich es laufen:

splint +gnuextensions main.c 
Splint 3.1.1 --- 03 Nov 2006 

Command Line: Setting +gnuextensions redundant with current value 
main.c:8:8: Parse Error. (For help on parse errors, see splint -help 
       parseerrors.) 

Und dies eröffnet zwei weitere Fragen, die ich nicht über vor dachte.

  1. "redundant mit Stromwert", welcher Stromwert?

  2. Warum ist es ein Parse Fehler und keine Warnung?


Update:: Es gibt eine posibility Schiene zu Patch ist, dieses Problem zu unterstützen, ich das aber noch nicht versucht haben, aber ich denke, es ist die Lösung.

+1

Während Sie dabei sind, sollten Sie das int innerhalb der for-Anweisung deklarieren. – starblue

+0

Erhalten Sie eine nervige Warnung oder einen Parserfehler? –

+0

und es ist der Abstand zwischen "int" und "i", der die Schiene bricht? – Johan

Antwort

7

Hier ist ein Patch: http://www.cs.virginia.edu/pipermail/splint-discuss/attachments/20080718/52cc25f6/attachment.obj

Sie sollten in der Lage sein, dass durch Patch -p2 zu füttern, wenn Sie in die Schiene/src Verzeichnis sind, und dann sollte es nur wieder aufzubauen.

, das von dieser E-Mail ist: (. Tut mir leid, den Abstand auf das) http://www.cs.virginia.edu/pipermail/splint-discuss/2008-July/001190.html

Sie werden feststellen, dass schließlich finden, wenn Sie den Thread starblue verknüpft, folgen, aber ich dachte, dass ich springen würde bis zum Ende für dich.

Splint scheint jetzt leider ohne einen Betreuer zu sein. Ich würde darüber nachdenken, etwas zu tun, wenn ich nicht so beschäftigt bin.

Jake

+0

Ich habe gerade versucht, diesen Patch auf die Schiene 3.1.2 Quellen anzuwenden. Ich habe Syntaxfehler bekommen, als ich versucht habe, es zu bauen. Ich habe auch Syntaxfehler, als ich versuchte, Schiene 3.1.2 * ohne * den Patch zu bauen. –

2

Regel mit Schiene, wenn etwas unterdrückt werden kann, wird es sagen, „diese Unterdrückung mit + thisflag oder -thisflag“

Sie könnten Schiene + gnuextensions foo.c versuchen, die auf den (meisten) dreht GNU/GCC Erweiterungen, mit denen sonst Probleme verbunden wären.

Ich benutze Schiene fast so häufig wie ich Valgrind verwenden.

Edit:

Wie andere gesagt haben, Ihr Lauf in die Parser (nicht der Analysator), so wirklich Flaggen werden nicht in diesem Fall zu helfen.

+0

- "Command Line: Einstellung + gnuextensions redundant mit dem aktuellen Wert", gibt es etwas zu blockieren. – Johan

3

Ich bin mit Schiene nicht vertraut, aber aus their FAQ:

Splint ist unabhängig von Ihrem Compiler. Es prüft Standard-C-Code, gemäß der ISO C99 Spezifikation. Splint unterstützt die meisten, aber nicht alle, der C99-Erweiterungen zu der ANSI C. Splint unterstützt einige der der GCC-Compiler-Erweiterungen (wenn + gnuextensions verwendet wird).

Die Position Ihrer Deklaration ist unter C99 perfekt konform, also könnten Sie dies vielleicht als Fehler in der Schiene betrachten. Oder es ist eine der "Erweiterungen" noch nicht von Schiene unterstützt. In beiden Fällen könnten sie an Ihrem Feedback interessiert sein. Es sollte keinen Grund dafür geben, dass sich ein C99-konformes Lint-Tool über Variablendeklarationen beschwert.

5

This thread auf der Mailingliste von Splint diskutiert das Problem.

Es scheint, dass der Parser meistens C89/C90 ist, nur die Bibliothek scheint C99 zu sein.

Da das Problem mit dem Parser ist, können Sie es nicht durch Setzen von Flags verschwinden lassen.

+1

Ich denke, Sie haben Recht, aber ich sende eine Mail an diese Liste, um es herauszufinden. http://www.cs.virginia.edu/pipermail/splint-discuss/2009-March/001288.html Mal sehen, was passiert. – Johan

Verwandte Themen