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
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ä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.
  • Das Spiel zum Wochenende: Suppressed
    In einem kostenlosen Jump-and-Run-Spiel von Zephyo versucht ein kleiner Waisenjunge aus einem fiktiven totalitären Staat zu flüchten. Mit der beklemmenden Inszenierung möchte der Entwickler vor allem zum Nachdenken anregen.
  • 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

LU 10/2016: Kryptographie

Digitale Ausgabe: Preis € 0,00
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

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

Aktuelle Fragen

zweites Bildschirm auf gleichem PC einrichten
H A, 30.09.2016 19:16, 0 Antworten
Hallo, ich habe Probleme mein zweites Bildschirm einzurichten.(Auf Debian Jessie mit Gnome) Ich...
Probleme mit MPC/MPD
Matthias Göhlen, 27.09.2016 13:39, 2 Antworten
Habe gerade mein erstes Raspi Projekt angefangen, typisches Einsteigerding: Vom Raspi 3B zum Radi...
Soundkarte wird erkannt, aber kein Ton
H A, 25.09.2016 01:37, 6 Antworten
Hallo, Ich weiß, dass es zu diesem Thema sehr oft Fragen gestellt wurden. Aber da ich ein Linu...
Scannen nur schwarz-weiß möglich
Werner Hahn, 20.09.2016 13:21, 2 Antworten
Canon Pixma MG5450S, Dell Latitude E6510, Betriebssyteme Ubuntu 16.04 und Windows 7. Der Canon-D...
Meteorit NB-7 startet nicht
Thomas Helbig, 13.09.2016 02:03, 4 Antworten
Verehrte Community Ich habe vor Kurzem einen Netbook-Oldie geschenkt bekommen. Beim Start ersch...