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.
  • 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 02/2016: Alt-PCs flott machen

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!       

Der Tipp der Woche

Schon gewußt?

14.11.2015

Auch unter Ubuntu 15.10 kann man wieder mit dem Startmedienersteller (alias Startup Disk Creator) ein Live-System auf einem USB-Stick einrichten. ...

Fehler des Startmedienerstellers von Ubuntu 15.10 umgehen

Aktuelle Fragen

Leap 42.1 und LibreOffice
Heinz Kolbe, 09.02.2016 21:54, 0 Antworten
Moin moin, auf meinem Notebook habe ich Leap 42.1 und Win 10 installiert. Alles läuft rund nur...
Tails Update
Val Lerie, 11.01.2016 10:51, 0 Antworten
Hallo zusammen, updaten > update Speichern unter > Persistent nicht möglich, mit der Meldung;...
Recoll
Jürgen Heck, 20.12.2015 18:13, 4 Antworten
Wie kann man mit Recoll nach bestimmten Zeichen/Satzzeichen bzw. Zeichenkombinationen suchen, z....
Wings Platinum 4 auf Linux?
Bodo Steguweit, 18.12.2015 11:37, 4 Antworten
Hallo in die Runde ich nutze für meine Diashows Wings Platinum 4 als Diareferent. Arbeite jetzt...
Bandbreite regulieren
Georg Armani, 25.11.2015 16:50, 1 Antworten
Hallo, ich bin ein Neuling in Sachen Linux und hoffe auf Hilfe. Ich habe zwei Windows Rechner...