Meister Propper

Natürlich bietet Linux dem Programmierer etwas gegen fehlende Grundinformation, Syntaxverbrechen, Sinnlosigkeit und Endlosschleifen. Es ist der Befehl lint. Nicht zu verwechseln mit Lindt – das ist ein Süßwarenfabrikant und alles andere als sinnlos.

  • -a: Reklamation bei Zuweisung von long-Werten an Variablen die nicht long sind unterdrücken
  • -u: Reklamationen bei Funktionen und externen Variablen unterdrücken, die verwendet und nicht definiert oder definiert und nicht verwendet werden
  • -v: Reklamation von unbenutzen Argumenten in Funktionen unterdrücken
  • -x: Keine Variablen melden, auf die externe Deklarationen verweisen, die jedoch niemals verwendet werden

Mit Lint ist der Programmierer mit einem Werkzeug ausgestattet, das seinen Quellcode auf viele Probleme hin untersucht. Dabei meckert Lint soviel an, dass es dem fortgeschrittenen Programmierer schon wieder zu lästig sein könnte. Damit die Software aber nicht allzuviel meckert, wartet eine ganze Reihe von Optionen auf ihren Einsatz.

Mit Sicherheit ist der beste Weg, Unix-Befehle zu erlernen, derjenige, sie zu benutzen. Das ist mit Lint nicht anders. Aber mehr noch: Der Befehl lint hilft einerseits dem Programmieranfänger, Fehler in seiner Denkweise zu finden, und andererseits dem etwas fortgeschritteneren Programmierer, seinen Kodierungsstil zu verbessern.

Für die ersten Schritte schaut man sich am Besten ein kleines Programm an, dem es hier und da an Sauberkeit mangelt, und jagt es durch Lint.

Ein C-Programm mit Macken

Das folgende C-Programm (Listing 1, sample.c) soll keine schlaue Aufgabe übernehmen, es dient nur der Verdeutlichung, was man alles richtig und falsch machen kann und wie Lint einem dabei unter die Arme greifen kann.

Listing 1

sample.c

01 #include <stdio.h>
02
03 int f(void)
04 {
05   return 0;
06 }
07
08 int g(void)
09 {
10   return 1;
11 }
12
13 int rueckgabe(void)
14 {
15   return 2;
16 }
17
18 int main()
19 {
20   int unbenutzt;
21   long lang;
22   short kurz;
23   long undefiniert;
24   long effektlos;
25
26   lang=3;
27   kurz=lang;
28   lang=undefiniert;
29   effektlos=1;
30   lang==effektlos;
31   if(1==0)
32   {
33     lang=4;
34   }
35   while(lang > f()) g();
36   printf("LinuxUser!\n");
37   rueckgabe();
38 }

Ruft man nun lint sample.c auf, erhält man folgende Ausgabe für den geschriebenen Code (wenn Lint Ausgaben für Bibliotheken ausgibt, so können diese fürs erste ignoriert werden).

volker@maus> lint sample.c
sample.c:
sample.c(28): warning: undefiniert may be used before set [158]
sample.c(20): warning: unbenutzt unused in function main [192]
sample.c(27): warning: kurz set but not used in function main [191]
sample.c(38): warning: function main falls off bottom without returning value [217]

Es werden verschiedene Warnungen ausgegeben:

  • Die erste Warnung bezieht sich auf die Zeile 28 und stellt korrekterweise fest, dass die Variable undefiniert nicht initialisiert wurde, aber dennoch der Variablen lang zugewiesen wird. Hier wurde der Speicherinhalt, der sich zufällig hinter undefiniert verbirgt, weitergereicht. So etwas ist nicht nur ein schlechter Programmierstil, das ist einer der Hauptgründe dafür, dass Software einfach abstürzt.
  • Die zweite Warnung verweist auf die Zeile 20 und stellt fest, dass ich im Programm die Variable unbenutzt deklariert habe, ohne sie an irgendeiner weiteren Stelle wieder zu benutzen. Das führt zwar nicht zu Abbrüchen des Programms, verbraucht aber sinnlos Speicher und verwirrt nur, wenn man das Programm später noch einmal liest. "Wozu habe ich die Variable denn nochmal gebraucht???"
  • Die dritte Warnung erkennt in der Zeile 27, dass die Zuweisung der long-Variablen lang auf die short-Variable kurz zu einem Informationsverlust führen wird. Denn long-Variablen verwenden vier Byte Speicher und können Zahlen von -2147483648 bis +2147483647 beherbergen, short-Variablen belegen aber nur ein Byte Speicher und reichen daher nur für -128 bis 127 aus. Eine Zuweisung ist daher äußerst gefährlich.
  • Die vierte Warnung hat sich die Struktur der Funktion main() genauer angesehen. Für diese Funktion wurde bei der Funktionsdeklaration der Rückgabewert int angegeben. Die Funktion selbst macht eine ganze Menge. Nur was sie nicht macht, ist einen Wert mit return zurückzugeben. Das habe ich leider schon oft bei C-Programmierern beobachten können. Sie schludern das return in der main()-Funktion. Das ist nicht nur schlechter Stil, sondern verhindert zudem, dass die aufrufende Instanz (in der Regel die Shell oder ein Skript), das Erfolgsverhalten des C-Programms kontrollieren kann. Stattdessen ist die Rückgabe des C-Programms nicht definiert.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • Splint und Co: Tools zur statischen Code-Analyse
    Zwar finden Compiler Syntaxfehler in Programmen, aber auch syntaktisch korrekter Code kann Ungenauigkeiten, logische Fehler oder veraltete Funktionen beinhalten. Solche Probleme spüren Sie mit Quellcode-Analyzern auf.
  • Im Innern der Muschel
    Mit der Version 4 erhält die Bourne Again Shell (Bash) neue Funktionen, die sie einmal mehr als leistungsfähige Programmierschnittstelle zum System und zu Applikationen qualifiziert.
  • Entwicklungshelfer
    Nachdem in den ersten Teilen der Python-Einführung die Sprache beschrieben wurde, geht es im letzten Teil um nützliche Hilfen rund um Python.
  • Erste Schritte mit Bash-Skripten
    Das Programmieren von Shell-Skripten ist keine Hexerei. Schon mit wenigen Grundkenntnissen sparen Sie durch das Automatisieren alltäglicher Aufgaben viel Zeit.
Kommentare

Infos zur Publikation

title_2014_10

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Windows 8 startet nur mit externer Festplatte
Anne La, 10.09.2014 17:25, 4 Antworten
Hallo Leute, also, ich bin auf folgendes Problem gestoßen: Ich habe Ubuntu 14.04 auf meiner...
Videoüberwachung mit Zoneminder
Heinz Becker, 10.08.2014 17:57, 0 Antworten
Hallo, ich habe den ZONEMINDER erfolgreich installiert. Das Bild erscheint jedoch nicht,...
internes Wlan und USB-Wlan-Srick
Gerhard Blobner, 04.08.2014 15:20, 2 Antworten
Hallo Linux-Forum: ich bin ein neuer Linux-User (ca. 25 Jahre Windows) und bin von WIN 8 auf Mint...
Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 1 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...
o2 surfstick software für ubuntu?
daniel soltek, 15.07.2014 18:27, 1 Antworten
hallo zusammen, habe mir einen o2 surfstick huawei bestellt und gerade festgestellt, das der nic...