Dokumentation zu C-LINT V1.2 vom 08.05.91 Geschrieben unter SOZOBON-C fr Atari und Amiga von Holger Weets Kritik, Anregungen, Bugs, Verbesserungs-Vorschl„ge und Geldspenden an: Holger Weets Dachsweg 44 2900 Oldenburg Ich freue mich ber jede Reaktion auf mein Programm, insbesondere aber ber eine Belohnung in Form einer kleinen Geldspende. Wenn der Spende ein frankierter Rckumschlag und eine Diskette beiliegt, dann wird sie mit allerlei ntzlichen Programmen vollkopiert und zurckgesandt. INHALT: 0. Updates 1. Aufruf von C-LINT 2. System-spezifische Daten -- C-LINT.DAT 2.1. Kommando #f -- Funktionen mit Format-String 2.1.1. Plausibilit„t des Format-Strings 2.2. Kommando #v -- Funktionen mit variabel vielen Parametern 2.3. Kommando #x -- Funktionen, die nicht zurckkehren 3. Optionen -- Erkl„rung aller Options-Abh„ngigen Funktionen 3.1. Ausgabe-Datei w„hlen (statt Bildschirm) -o 3.2. Test-Datei-Namen aus einer Datei einlesen -d 3.3. Alle Warnungs-Meldungen unterdrcken -e 3.4. Anzahl signifikanter Zeichen von Identifiern festlegen -i -> Namens-Kollision globaler Identifier 3.4.1. Form der Liste der Namens-Kollisionen 3.5. Namens-Kollisionen bei Lokale Identifiern -l 3.6. Am Ende der Bearbeitung auf Tastendruck warten -h 3.7. Liste aller verwendeten Funktionen erzeugen -f 3.7.1. Form dieser Liste 3.8. Noch eine Funktionen-Liste -c 3.8.1. Form dieser Liste 3.9. Aufruf-Graph erzeugen (und noch eine Funktionen-Liste) -g 3.9.1. Form dieser Liste 3.10. Art und Anzahl von Return-Anweisungen -r 3.11. Anzahl šbergabe-Parameter an Funktionen -p 3.12. Zuweisung statt Vergleich -z 3.13. Bei Verwendung von Wildcards nachfragen (nur ATARI) -a 3.14. Liste der selbstdefinierten Typen erzeugen -t 3.14.1. Form dieser Liste 3.15. Case/default ohne break -b 3.16 Geschachtelte Kommentare -k 3.17. Backslash-Notation -s 3.18. Nicht erreichbare Anweisungen -u 3.19. Floating-Point-Indikatoren -x 3.20. Variablen-Listen erzeugen -v 3.20.1. Form dieser Liste 3.21. Kurzschluž-Logik -m 3.22. Variablen-Trace-Liste(n) erzeugen -y 3.22.1. Form dieser Liste 4. Options-unabh„ngige Tests 5. Erg„nzung zu den erzeugbaren Listen 6. Bugs 7. Geplantes 8. Noch ein Wort zum UNIX-LINT 0. UPDATES V1.0 -> V1.1: - Es mssen nicht mehr alle zu testenden Dateien in der Kommandozeile angegeben werden, stattdessen k”nnen die Datei-Namen jetzt aus einer Datei eingelesen werden (Option -dNAME) Hiermit sollte der l„stigen Beschr„nkung der L„nge der Kommandozeile endlich der garaus gemacht worden sein. - Das Aussehen der Meldungen wurde ge„ndert, jetzt kann jeder Meldung der zugeh”rige Dateiname entnommen werden. - der Fehler, der bei Deklaration von lokalen Variablen der Form "struct abc Var;" auftrat, ist behoben worden - der Fehler beim Anmeckern von unpassenden Formatstrings bei den Funktionen, die aus der Datei CLINT.DAT eingelesen werden, ist behoben - bei der Ausgabe der Funktionen-Liste wird der Dateiname jetzt ohne Pfad ausgegeben, was eine optisch ansprechendere Form der Tabelle zur Folge hat. - die Option zur Festlegung der Maximalzahl auszugebender Fehler und Warnungen (-e und -w) wurden entfernt, stattdessen bewirkt '-e' jetzt, daž s„mtliche Meldungen unterdrckt werden, so daž nur noch die Listen ausgegeben werden. V1.1 -> V1.2: - Ein Fehler im Zusammenhang mit der Verwendung von 'sizeof', welcher zu zwei Bomben fhrte, ist behoben worden. - C-Lint wurde mit der neuen, Assembler-optimierten, entwanzten und erweiterten Version der DLibs bersetzt. 1. AUFRUF: CLINT [optionen] file1 [file2 ...] 2. CLINT.DAT Hierbei handelt es sich um eine Datei, in der diverse Funktionsnamen stehen, welche von C-LINT bei einigen šberprfungen bercksichtigt werden. Beim Start von C-LINT wird versucht, diese Datei im aktuellen Directory zu finden, wenn sie dort nicht existiert, dann wird sie nicht geladen und die mit den in ihr enthaltenden Informationen durchzufhrenden šberprfungen werden nicht durchgefhrt. Es gibt aktuell 3 verschiedene Typen, die jeweils durch ein Kommando eingeleitet werden, denen eine Liste von Namen folgt, wobei in einer Zeile der Datei jeweils entweder ein Kommando oder EIN Name steht. Die Kommandos sind: #f Die Funktionen mit Format-String. Zu diesen geh”rt beispielsweise die Funktion printf() (Syntax: printf(, [Par1, Par2, ...])). Die in dieser Liste aufgefhrten Namen werden beim Auffinden im Quell- text auf Existenz eines Format-Strings untersucht, und dieser dann mit den ihm folgenden Parametern auf Anzahl-Gleichheit untersucht. D.h. 'printf("%s", a);' wird als in Ordnung angesehen wohingegen bei 'printf("%s");' gewarnt wird, weil die Anzahl der geforderten Parameter (einer, n„mlich '%s') nicht mit der Anzahl der angegebenen Parameter bereinstimmt. Der Sonderfall '%*...' wird in der Art von printf() behandelt, d.h. er fhrt bei Verwendung in scanf() zu einem Fehler. Wer jetzt nicht weiž, was '%*' bedeutet, der kann das nachlesen oder einfach vergessen, denn das wird ohnehin kaum verwendet. Achtung: in diese Liste sollten nur Funktionen eingetragen werden, deren Formatstring C-šblich aussieht (jedes '%' steht fr einen Parameter, Ausnahme: '%%' steht fr das Zeichen '%') ANMERKUNG 1: alle in dieser Liste aufgefhrten Funktionen bekommen auto- matisch das Attribut 'variable Anzahl Parameter' (siehe '#v') ANMERKUNG 2: die beiliegende Datei beinhaltet die vollst„ndigen Listen fr SOZOBON-C und die DLibs. Bei Verwendung anderer C-Systeme oder Bibliotheken muž die Datei eventuell modifiziert werden. #v Die Funktionen mit variabler Anzahl von Parametern. Zu diesen geh”rt beispielsweise printf() Die Funktionen mit Format-String sollten hier NICHT noch einmal aufge- fhrt werden, sie bekommen automatisch auch dieses Attribut. C-LINT z„hlt bei jedem im Quelltext vokommenden Funktions-Aufruf die Anzahl der bergebenen Parameter und merkt sich diese Zahl. Dadurch ist es m”glich, Programmierfehler der Form zu finden, daž zu viele oder zu wenig Parameter angegeben werden. Die hinter #v angegebene Liste wird nun jedesmal durchsucht, wenn ein solcher Fall aufgedeckt wird, und falls die betreffende Funktion gefunden wird, wird eine ent- sprechende Warnung unterdrckt. (Siehe dazu Option -p) #x Die Funtionen, die ein C-Programm terminieren. Zu diesen geh”rt bei- spielsweise die Funktion exit() C-LINT untersucht einen Quelltext insbesondere auch nach nicht erreich- baren Anweisungen. Dies sind z.B. solche, die direkt hinter einem 'return', 'break', 'continue' oder 'goto' stehen (im gleichen Block). Da es jedoch auch Funktionen gibt, die nicht zurckkehren, wrden nicht alle F„lle entdeckt, wenn in dieser Liste nichts angegeben wird. Entdeckt werden ohnehin nicht alle F„lle, denn wer kann schon entscheiden, ob z.B. der Block nach 'while (a == 10)' wirklich einmal ausgefhrt wird ? Siehe hierzu auch Option -u 3. OPTIONEN: Alle Optionen k”nnen wahlweise als Grož- oder Klein-Buchstaben angegeben werden. Damit ist es m”glich, C-LINT auch vom Desktop aus zu benutzen. -oOUTFLIE Alle Ausgaben von C-LINT werden statt auf den Bildschirm in die Datei geschrieben. Auf dem Bildschirm ist dann nur noch zu sehen, welche Datei gerade bearbeitet wird. Geplant ist, daž die Angabe von optional ist, d.h wenn nur '-o' angegeben wird, dann wird ein Default-Name verwendet. -e C-Lint soll keine Meldungen ausgeben. Diese Option ist gedacht fr die F„lle, in denen nur irgendwelche Listen gewnscht sind. -dFILE Alle Test-Datei-Namen werden aus der Datei FILE eingelesen, die Kommando-Zeile ist somit frei (und lang genug), um nur noch die Optionen aufzunehmen. Einschr„nkungen: - Alle Dateinamen, die sich in der Kommandozeile befinden, werden ignoriert - es drfen keine Wildcards verwendet werden - in der Datei drfen keine Optionen angegeben werden, diese geh”ren s„mtlichst in die Kommandozeile -iMAXIDLEN Hiermit wird die Anzahl der Zeichen festgelegt, die das verwendete C-System unterscheidet (die signifikanten Zeichen also). Gleichzeitig wird durch die Angabe dieser Option das Testen aller Identifier auf die angegebene L„nge aktiviert. Da die Anzahl der signifikanten Zeichen vom schw„chsten Glied des C-Systems vorgegeben wird und dies, wie bei SOZOBON-C, der Assmebler sein kann, sind nicht immer alle Identifier von dieser Einschr„nkung betroffen. Da es im Fall SOZOBON-C nur die globalen Identifier betrifft, werden von C-LINT defaultm„žig auch nur diese auf die signifikanten Stellen berprft. C-LINT berprft alle Identifier daraufhin, ob ihre L„nge gr”žer oder gleich der Anzahl der signifikanten Stellen ist, und nimmt diese Identifier in eine Tabelle auf. Am Ende der Bearbeitung wird diese auf m”gliche Namens-Kollisionen berprft. Dies erfolgt w„hrend der Ausgabe einer Liste mit allen zu langen Identifiern, welche folgende Form hat: NAME|šBERHANG ART wobei - NAME alle sigifikanten Stellen des Identifiers - šBERHANG alle darber hinaus angegebenen Stellen - ART Typ des Identifiers: - (Funktion) Identifier ist ein Funktions-Name - (global) Identifier ist eine globale Variable - (lokal) Identifier ist eine lokale Variable Falls eine Kollision auftreten k”nnte, wird der entsprechende Name von einem '~' Zeichen angefhrt und um ein paar Leerzeichen eingerckt. -l Bewirkt, daž auch lokale Identifier auf die Anzahl der signifikanten Zeichen getestet werden. Mir ist zwar kein Compiler bekannt, bei dem die L„nge lokaler Identifier beschr„nkt ist, aber man kann ja nie wissen. Die ausgegebene Liste sieht genauso aus, wie fr die Option -i (siehe dort) beschrieben. -h Bewirkt, daž C-LINT am Ende der Bearbeitung auf einen Tastendruck wartet. Dies ist sinnvoll, wenn C-LINT vom Desktop aus benutzt werden soll. -f Bei Angabe dieser Option wird am Ende der Bearbeitung eine Liste aller gefundenen Funktionen ausgegeben. Diese hat folgende Form: T&S NAME(PAR) [FILE] CALLS wobei T&S Typ und Speicherklasse der Funktion NAME der Name der Funktion PAR Anzahl der Parameter der Funktion oder '?' falls die Funktion mit variabel vielen Parametern ver- wendet wird, oder '-' falls die Anzahl der Parameter nicht bekannt ist, z.B. bei 'extern FILE *fopen();' und keinem Aufruf dieser Funktion FILE Name der Datei, in der die Funktion deklariert wird, ohne Pfad CALLS Anzahl der Aufrufe der Funktion -c Diese Option bewirkt, daž C-LINT fr jede Funktion eine Liste mit allen in ihr aufgerufenen Funktionen ausgegeben wird, welche folgende Form aufweist: NAME [ANZ] - NAME Name der aufgerufenen Funktion - ANZ Anzahl ihrer Aufrufe in dieser Funktion -g[name] Die Angabe dieser Option bewirkt, daž C-LINT am Ende der Bearbeitung einen Aufruf-Graphen beginnend entweder bei der Funktion oder, falls kein Funktions-Name angegeben wird, bei main(), ausgibt. Diese Liste hat folgende Form: NR NAME1 {[MSG]} NR NAME2 {[MSG]} falls NAME2 von NAME1 aufgerufen wird NR NAME3 {[MSG]} falls NAME3 von NAME2 aufgerufen wird NR NAME4 {[MSG]} falls NAME4 von NAME1 aufgerufen wird : : : : - NR : die Nummer der ausgegebenen Zeile, beginnend bei 0 - NAMEx: Name der Funktion - MSG : "SIEHE ZEILE x" - der Unterbaum der betreffenden Funktion wurde bereits in Zeile x ausgegeben "REKURSION" - die betreffende Funktion ruft sich selbst rekursiv auf "INDIREKTE REKURSION" - die betreffende Funktion ruft eine der Funktionen auf, durch die sie aufgerufen wurde. Beispiel: test1() ruft test2() auf, und test2() ruft test1() auf -r Bei Angabe dieser Option testet C-LINT fr jede Funktion, wieviele und welche Art von return - Anweisungen in ihr verwendet werden. Gewarnt wird in folgenden F„llen: - die Funktion ist vom Typ void und C-LINT findet ein return(WERT) (=> void - Funktionen geben keine Werte zurck) - die Funktion ist nicht vom Typ void und C-LINT findet ein return ohne Wert (=> Rckgabewert ist undefiniert) - die Funktion ist nicht vom Typ void und enth„lt kein return (=> Rckgabewert ist undefiniert) - die Funktion enth„lt mehrere return - Anweisungen (=> eine Art von unsauberer weil unbersichtlicher Programmierung) Diese Option ist aber wohl eher etwas fr heimliche Pascal-Programmierer, weshlab sie defaultm„žig abgeschaltet ist. -p C-LINT z„hlt normalerweise bei jeder Funktions-Deklaration und bei jedem Funktions-Aufruf die Anzahl der šbergabe-Parameter. Wird dabei Differenz in der Anzahl der Parameter festgestellt, so wird eine Warnung ausgegeben und die Funktion in der Ausgabe-Liste entsprechend markiert (siehe dazu '-f'). Diese Warnungen werden nur beim ersten Auffinden ausgegeben und k”nnen mit der Option '-p' vollst„ndig unterdrckt werden. -z Ohne diese Option testet C-LINT jede Bedingung (bei if & while) daraufhin, ob in ihr Zuweisungen stattfinden. Da in C der Vergleich durch '==' und die Zuweisung durch '=' ausgedrckt wird, w„hrend letzteres Symbol in den meisten anderen Programmiersprachen der Ver- gleichs-Operator ist, wird gerade von C-Anf„ngern h„ufig der Fehler gemacht, 'if (a = b)' zu schreiben, obwohl sie 'if (a == b)' meinen. Um diesem Umstand Rechnung zu tragen, werden solche Konstrukte zusammen mit der Klammerebene, in der sie auftreten, in Form einer Warnung angemerkt. Wer meint, daž er solche Fehler nicht macht oder sicher ist, daž der Fehler, der gerade gesucht wird, nicht auf diese Fehler-Art zurckzufhren sein kann, der kann die Warnungen mit der Option '-z' unterdrcken. -a In der Kommandozeile fr C-LINT sind Wildcards erlaubt. Diese sind jedoch etwas mit Vorsicht zu geniežen, da die Betriebssystem-Routinen Fsfirst() und Fsnext() verwendet werden, insbesondere drfen die Wildcards NUR im Dateinamen, NICHT jedoch im Zugriffspfad angewendet werden. Mit dieser Option kann eingestellt werden, daž bei Verwendung von Wildcards bei jedem passenden Dateinamen erst noch nachgefragt wird, bevor dieser wirklich benutzt wird, dies erm”glicht die grožzgige Anwendung, auch wenn das Ergebnis eine Obermenge der gewnschten Dateien wird. ANMERKUNG: dies gilt nur fr die Atari-Version, in der Amiga-Version kann C-LINT nur von einer Command-Line-Shell aufgerufen werden, und diese expandiert Wildcards selbstst„ndig. -t Bei Angabe dieser Option gibt C-LINT am Ende der Bearbeitung eine Liste aller selbstdefinierten Typen aus, die folgende Form hat: TYP NAME wobei TYP 'struct', 'enum', 'union' oder 'typedef' ist NAME der Name des Typs ist -b C-LINT testet bei allen case - Anweisungen, ob sie mit break abge- schlossen sind. Ausnahme: mehrere case - Anweisungen folgen direkt aufeinander, denn in diesem Fall handelt es sich offensichtlich um eine Aufz„hlung. Wird zu einer case - Anweisung keine break - Anweisung ge- funden, so wird eine Warnung ausgegeben, da ein ungewollt weggelassenes break zu unvorhergesehenen Reaktionen des Programmes fhren kann (sehr l„stiger und schwer zu findener Fehler ...) Mit der Option '-b' k”nnen diesbezgliche Warnungen unterdrckt werden. -k Wenn C-LINT auf einen Kommentar trifft, wird dieser natrlich berlesen. Dabei wird allerdings getestet, ob sich im Kommentar ein zweites '/*' befindet, da dies auf einen ungewollt geschachtelten Kommentar hindeutet. Wird ein solches Token gefunden, so erfolgt eine Warnung. Wenn diese Meldungen unerwnscht sind, k”nnen sie durch die Option '-k' unterdrckt werden. C-LINT meckert natrlich trotzdem, wenn ein Kommentar am Datei-Ende noch nicht wieder geschlossen wurde oder mitten im Text pl”tzlich ein '*/' - Token gefunden wird. -s Wenn C-LINT ein <"> oder ein <'> findet, so handelt es sich offen- sichtlich um die Einleitung einer String- bzw. Zeichen- Konstante, und diese wird berlesen. Dabei wird jedoch auf Token der Form '\' geachtet und solche Konstellationen, welche keinen Sinn machen, werden mit einer Warnung quittiert. Falls mit einem C-System gearbeitet wird, welches aužerstandardm„žige Backslash-Notation verwendet, oder die Sinnhaftigkeit der Backslash-Konstruktionen nicht interessieren, k”nnen diesbezgliche Warnungen mit der Option '-s' unterdrckt werden. C-LINT meckert natrlich trotzdem, falls ein String nicht am Zeilenende terminiert (nicht bei "....\ und dann ein Newline, daž ist ja erlaubt), oder im String das Datei-Ende erreicht wird. -u C-LINT durchsucht den Quelltext auch nach nicht erreichbaren Anweisungen. Werden solche gefunden, so wird dies normalerweise mit einer Warnung quittiert. Mit der Option -u k”nnen diese Meldungen unterdrckt werden. -x Wird diese Option angegeben, so untersucht C-LINT den Quelltext nach Indikatoren fr die Verwendung der Floating-Point-Bibliothek. Dies ist besonders dann interessant, wenn der Inhalt des Quelltextes nicht genau bekannt ist. Geprft wird auf: - Auftreten der Schlsselw”rter 'float' und 'double' - Floatingpoint-Konstanten der Form . - Floatingpoint-Konstanten der Form {e|E} (nicht bei Hexzahlen [0x]) -v Diese Option bewirkt, daž fr jede Funktion eine Liste mit allen be- nutzten Variablen mit folgendem Aussehen generiert wird: T&S {.}NAME{[]} [ANZ] (TYP){(ASGN)}, wobei - T&S gibt, sofern bekannt, Typ und Speicherklasse der Variablen an. (Unbekannt sind diese Daten eigentlich nur dann, wenn es sich um Preprozessor-Symbole handelt. Abhilfe: den Text vor Behandlung durch C-LINT erst durch einen CPP expandieren lassen) Falls diese Daten nicht bekannt sind, so wird die zugeh”rige Variable auch nicht auf Verwendung getestet. - . zeigt an, daž es sich bei dieser Variablen um ein Struktur- Feld handelt. Beispiel: struct test { int a1; char a2; } : p.a1 = 7; : In der Variablen-Liste erscheint - 'test' berhaupt nicht, da es sich hierbei nicht um eine Variable, sondern um einen Typ handelt - 'a1' als '.a1', da dieser Bezeichner ein Struktur-Feld ist - 'p' als 'p', da es sich um eine 'echte' Variable handelt. - NAME ist der Name der betreffenden Variablen - [] deutet an, daž die Variable indiziert verwendet wird, es sich also wahrscheinlich um ein Array handelt - ANZ ist die Anzahl ihrer Vorkommen - TYP ist entweder 'global' ,'lokal' oder 'Parameter' - (ASGN) zeigt an, das diese Variable definitiv zugewiesen wurde, was insbesondere fr die Erkennung von Seiteneffekten sinnvoll ist Am Ende der Bearbeitung wird aužerdem eine Liste aller globalen Variablen ausgegeben. -m Bei Angabe dieser Option testet C-LINT nicht auf Fehler, die auf die in C verwendete sog. Kurzschluž-Logik zurckzufhren sind. In Anweisungen wie: if ( (a == b) && fun()) wird der Aufruf der Funktion fun() nicht immer ausgefhrt, wenn also der Funktionsaufruf wichtig ist, weil in ihr z.B. globale Variablen ver„ndert werden, so liegt ein einigermažen schwer zu findender Fehler vor. Žhnlich verh„lt es sich mit Anweisungen der Form if ( (a == b) && (++c) ) Die Anweisung '++c' wird nur ausgefhrt, wenn '(a == b)' TRUE ergibt. Auch dies kann ein schwer entdeckbarer Fehler sein. C-LINT warnt bei - Zuweisungen nach '&&' oder '||' - Funktions-Aufrufen nach '&&' oder '||' - '++' / '--' nach '&&' oder '||' Da die Auswertungs-Reihenfolge vom C-Compiler bestimmt wird, also nicht zwangsl„ufig von links nach rechts erfolgt, k”nnen die Warnungen bei manchen Compilern grundlos sein, weshalb sie abschaltbar sind. -yNAME Durch die Angabe dieser Option zusammen mit dem Namen einer globalen Varibalen (NAME) wird eine Trace-Liste dieser Variablen erstellt, d.h. es wird am Ende der Bearbeitung eine Liste aller Funktionen, in denen die Variable NAME benutzt wird, ausgegeben. Diese Liste hat folgendes Aussehen: NAME1 wird benutzt in f1() f2() : NAME2 wird benutzt in f3() : etc. Beachtet werden dabei nur globale Variablen, falls šberdeckungen statt- finden, d.h. eine lokale Variable den gleichen Namen tr„gt, wie eine globale, so wird dies bercksichtigt, d.h. die betreffende Funktion wird nicht in die Liste aufgenomen. Falls die angegebene Variable in keiner Funktion benutzt wird, so wird sie bei der Ausgabe ignoriert, d.h. die 'wird benutzt in' - Zeile wird nicht ausgegeben. 4. AUžERDEM WIRD GETESTET AUF: - šberdeckungen von Variablen (eine lokale Var. heižt genauso wie eine globale, d.h. der Wert der globalen Var. ist in der Funktion nicht sichtbar) - deklarierte, aber nicht verwendete Variablen - deklarierte, aber nicht verwendete Funktionen, wobei natrlich nur 'echte' Funktions-Deklarationen bercksichtigt werden, und keine extern-Deklarationen - bergebene, aber nicht verwendete Parameter - zu viele geschlossene Klammern (es wird das entsprechende Klammer- symbol und die Nummer der Zeile, in der sie ge”ffnet wurde angezeigt) - unpaarige Klammern (es werden die gefundene und die erwartete Klammer mit ihren Zeilennummern ausgegeben) - goto (es wird ein Hinweis auf unsaubere Programmierung ausgegeben) - goto's zu Labels, welche nicht innerhalb derselben Funktion stehen (es werden die Namen des Labels und der Funktion ausgegeben) - Label's, welche nicht innerhalb derselben Funktion benutzt werden (es werden die Namen des Labels und der Funktion ausgegeben) - Label's, die innerhalb eines 'bedingten Blockes' stehen (if, while, for, switch, do) (es wird die Meldung "waghalsiges Sprungziel" ausgegeben) - main() - Aufrufe (es wird ein Hinweis auf unsaubere Programmierung ausgegeben) - bei Funktionen mit Format-String wird berprft, ob die Anzahl der angegebenen Parameter mit denen des Format-Strings bereinstimmt - #line [Dateiname]; Diese Anweisung wird blicherweise von Pr„prozessoren in den Quelltext eingestreut, falls #include ver- wendet wird, deshalb wird sie von C-LINT ausgefhrt, indem Zeilennummer und der evtl. angegebene Dateiname bernommen werden. Falls ein Datei- name angegeben wird, so wird er von C-LINT in die Ausgabedatei ge- schrieben. 5. LISTEN: Jeder ausgegebene Listen-Typ besitzt sein eigenes Prompt, ein Zeichen also, mit dem jede Zeile dieses Listen-Typs beginnt. Dies ist fr den Fall vorgesehen, daž die Ausgabedatei in mehrere Files unterteilt werden soll, z.B. eine fr jeden Listen-Typ. Mit der gew„hlten Form der Listen- ausgabe kann diese Unterteilung automatisch vorgenommen werden mit Programmen wie AWK, GREP etc. (gibts sowohl fr Amiga als auch fr Atari als PD-Software). Die Zeichen sind: # -- Variablen-Liste : -- Funktionen-Liste > -- nicht aufgerufene Funktionen $ -- selbstdefinierte Typen ! -- zu lange Identifier / m”gliche Namens-Kollisionen = -- Aufruf-Liste + -- Aufruf-Graph ] -- Trace-Listen 6. BUGS: - Preprozessor-Anweisungen werden bis auf '#line' (s.o.) komplett ignoriert. (BUG ???) - falls es Variablen gibt, deren Name gleich einer Funktion ist, so werden diese in der Variablen-Liste nicht bercksichtigt - der Test auf Zuweisung statt Vergleich wird beim ?: - Operator nicht ausgefhrt, '(a = b) ? anw() : fkt()' fhrt somit zu keiner Warnung von C-LINT. Ob dies ein Fehler ist, ist allerdings fraglich, denn solch eine Anweisung macht keinen Sinn, da immer der 'anw()' Teil ausgefhrt wrde ... (der SOZOBON-Compiler gibt an dieser Stelle auch eine Warnung aus) 7. GEPLANTES: - vielleicht baue ich demn„chst eine Option ein, mit der weitere Tests bei Funktionen durchgefhrt werden, welche aus irgendwelchen Bibliotheken stammen. Hierfr wird eine Datei abgelegt, in der alle Funktionen mit Typ & Anzahl Parameter stehen, und diese wird von C-LINT bei allen Funktionen verwendet, deren Ursprung nicht bekannt ist. - C-LINT wird ber direkt im Quelltext stehende Kommandos steuerbar sein. Geplant sind bisher: /* Lint_Off */ schaltet alle Ausgaben ab. Sinnig, wenn nur bestimmte Funktionen untersucht werden sollen. /* Lint_On */ Wenn die Ausgaben abschaltbar sind, mssen sie auch einschaltbar sein ... /* Var_Args */ die n„chste deklarierte/verwendete Funktion hat variabel viele Parameter, C-LINT soll hier nicht warnen /* unreachable */ ab hier steht absichtlich nicht-erreichbarer Code, also soll C-LINT hier nicht warnen 8. UNIX-LINT An dieser Stelle muž einmal ganz deutlich gesagt werden, das C-LINT KEINE versuchte Nachprogrammierung des UNIX-LINT ist. Alle in C-LINT eingebauten Funktionen sind auf meinem Mist gewachsen, und wer LINT kennt, wird sofort bemerken, das die beiden Programme sich v”llig unterschiedlich verhalten. UNIX-LINT erzeugt beispielsweise eine Art Objekt-Files und legt sehr viel Wert auf Typ-šberprfungen, w„hrend C-LINT solche Tests gar nicht durchfhrt (das ist ja gerade eine der positiven Seiten an C, das der Programmierer fr die Typ-šberprfungen selbst sorgen darf ...)