Programmiersprache C/C++

Unterstützende Werkzeuge zur Programmentwicklung

Aufgeführt sind vor allem Werkzeuge, die unter Unix-Systemen zur Verfügung stehen (könnten).
Für einige der Werkzeuge gibt es auch Äquivalente unter anderen Betriebssystemen.

Bemerkung:
Die angegebenen Werkzeuge besitzen in der Regel eine Vielzahl weiterer Aufrufparameter, die hier nicht diskutiert werden.

lint

  lint file
Überprüft Programme auf potentielle Probleme

Beispiel:
Quelltextdatei runden.c:

  #include <stdio.h>
  
  void main(void)
  {
    float x, y;
    long i;

    x = 1.0;
    y = 3.0;
    x = x/y;
    i = *(int *)&x;
    printf("1/3 = %8x\n", i);
  }
Eine Analyse des obigen Quelltexts mit lint liefert unter AIX:
  "runden.c", line 13: warning: main() returns random value to invocation 
  environment
  "stdio.h", line 205 ("llib-lc"): warning: function printf return value is 
  always ignored
Das obige C-Programm ist syntaktisch korrekt. Es birgt jedoch folgendes Problempotential in sich: lclint

  lclint filename1 ...
Quelltextprüfung, ähnlich wie lint.

cflow

  cflow filename1 ...
Ermittelt in C-Quelltext- und Objektcode-Dateien externe Referenzen.

Beispiel:
Eine Quelltext-Analyse des unter lint angegebenen Beispielprogramms liefert:

  1       main: (void) void, 
  2               printf: (* const char, ellipsis) int, <>
cflow wird im Zusammenhang mit in einigen Unix-Systemen zur Verfügung gestellt.

calls

  calls filename ...
Ermittelt Funktionsaufrufe in C-Quelltextdateien in hierarchischer Weise.

Beispiel:
Eine Analyse des Beispielprogramms runden.c liefert:

    1	main [runden.c]
    2		printf
Der Aufruf calls -e runden.c liefert unter AIX:

    1	main [runden.c]
    2		printf
  Index:
	_filbuf
	_flsbuf
	clearerr
	ctermid
	cuserid
	fclose
	fdopen
	feof
	ferror
	fflush
	fgetc
	fgetpos
	fgets
	fgetwc
	fgetws
	fileno
	fopen
	fp_read_rnd
	fp_swap_rnd
	fprintf
	fputc
	fputs
	fputwc
	fputws
	fread
	freopen
	fscanf
	fseek
	fsetpos
	ftell
	fwrite
	getc
	getchar
	gets
	getw
	getwc
	getwchar
	getws
	main [runden.c] [see line 1]
	pclose
	perror
	popen
	printf
	putc
	putchar
	puts
	putw
	putwc
	putwchar
	putws
	remove
	rename
	rewind
	scanf
	setbuf
	setvbuf
	sprintf
	sscanf
	tempnam
	tmpfile
	tmpnam
	ungetc
	ungetwc
	vfprintf
	vprintf
	vsprintf
c_count

  c_count filename ...
Ermittelt statistische Angaben über C-Quelltextdateien.

Beispiel:
Eine Analyse des oben angegebenen Programm runden.c liefert:

    13     7   |runden.c
----------------
    13     7    total lines/statements

     0	lines had comments         0.0 %
     0	comments are inline        0.0 %
     2	lines were blank          15.4 %
     1	lines for preprocessor     7.7 %
    10	lines containing code     76.9 %
    13	total lines              100.0 %

     0	comment-chars              0.0 %
     0	nontext-comment-chars      0.0 %
    42	whitespace-chars          29.2 %
    17	preprocessor-chars        11.8 %
    85	statement-chars           59.0 %
   144	total characters         100.0 %

    25	tokens, average length 2.32

  0.00	ratio of comment:code
cb

  cb filename1 ...
Grafische Aufbereitung von C-Quelltexten

Beispiel: Quelltextdatei unlesbar.c

  #include <stdio.h>
  #include <time.h>
  int main(int argc,char *argv[]){time_t t;
  if(argc==1)printf("%s an alle Nutzer !\n",*argv);
  else {printf("%s an ",*argv);while(--argc) printf("%s ",*(++argv));
  printf("\n");}
  time(&t);printf("%s/n",ctime(&t));return 0;}
Der Aufruf cb unlesbar.c erzeugt folgende Ausgabe:
  #include <stdio.h>
  #include <time.h>
  int main(int argc,char *argv[]){
	  time_t t;
	  if(argc==1)printf("%s an alle Nutzer !\n",*argv);
	  else {
		  printf("%s an ",*argv);
		  while(--argc) printf("%s ",*(++argv));
		  printf("\n");
	  }
	  time(&t);
	  printf("%s/n",ctime(&t));
	  return 0;
  }
cb beseitigt nicht alle Mängel im Notationsstil, läßt aber in jedem Fall die Programmstruktur besser sichtbar werden.

obscure

  obscure filename
  obscure -u filename
Transformiert eine Quelltextdatei: Mit obscure bearbeitete Quelltexte erschweren es dem Leser, Rückschlüsse auf die Programmlogik zu ziehen. Dies kann unter Umständen Probleme reduzieren, die sich für den Entwickler im Zusammenhang mit der Weitergabe von Quelltexten ergeben.

Beispiel:
obscure -u runden.c transformiert das obige Beispielprogramm wie folgt:

  #include <stdio.h>
  void main(void){float q0,q1;long q2;q0=1.0;q1=3.0;q0=q0/q1;q2=*(int*)&q0;
  printf("1/3 = %8x\n",q2);}
highlight

  highlight filename
Farbliche Hervorhebung von syntaktischen Konstruktionen in einer C-Quelltextdatei.

protoize

  protoize file1 ...
Transformation von C-Quelltextdateien:
Der Kopf einer Funktionsdeklaration im K&R-Stil wird so modifiziert, daß er dem ANSI-C-Standard entspricht.

Von jeder zu transformierenden Datei wird eine Sicherheitskopie angelegt.

Beispiel:

  int test(x, c, d)
       int x;
       char c;
       double d;
                                       wird transformiert zu
  int test(int x, char c, double d)
unprotoize

  unprotoize file1 ...
Transformation von C-Quelltextdateien:
Der Kopf einer ANSI-C gemäßen Funktionsdeklaration wird so modifiziert, daß er einer Funktionsdeklaration im K&R-Stil entspricht.

Von jeder zu transformierenden Datei wird eine Sicherheitskopie angelegt.

Beispiel:

  int test(int x, char c, double d)
                                       wird transformiert zu
  int test(x, c, d)
       int x;
       char c;
       double d;
prof

  prof
Erzeugt Ausführungsprofil eines Programms:
Analysiert wird die Häufigkeits des Aufrufes von Routinen durch das zu analysierende Programm.

Um das Ausführungsprofil eines Programms zu erhalten, sind folgende Schritte erforderlich:

  1. Übersetzung des Programms mit der Option p, z.B.:
       cc -p -o bsp bsp.c
       
  2. Ausführung des erstellten Programms, z.B.:
       bsp
       
    Im aktuellen Verzeichnis wird eine (binäre) Analysedatei mon.out angelegt.
  3. Aufruf des Analyseprogramms
       prof
       
    Das Analyseprotokoll wird auf die Standardausgabe ausgegeben.
    Bemerkung: Durch Umlenkung der Standardausgabe kann das Analyseprotokoll in einer Datei abgespeichert werden.
    prof bereitet die im vorherigen Schritt erstellte Analysedatei mon.out auf.
Beispiel:
Für das weiter oben angegebene Beispielprogramm unlesbar wird unter AIX folgendes Analyseprotokoll erstellt:
  Name                 %Time     Seconds     Cumsecs  #Calls  msec/call
  .main                  0,0        0,00        0,00       1      0,
  .catopen               0,0        0,00        0,00       1      0,
  .setlocale             0,0        0,00        0,00       1      0,
  .getenv                0,0        0,00        0,00       1      0,
  ._doprnt               0,0        0,00        0,00       2      0,
  ._xflsbuf              0,0        0,00        0,00       2      0,
  ._wrtchk               0,0        0,00        0,00       1      0,
  ._findbuf              0,0        0,00        0,00       1      0,
  ._xwrite               0,0        0,00        0,00       2      0,
  .free                  0,0        0,00        0,00       2      0,
  .free_y                0,0        0,00        0,00       2      0,
  .write                 0,0        0,00        0,00       2      0,
  .exit                  0,0        0,00        0,00       1      0,
  .moncontrol            0,0        0,00        0,00       1      0,
  .monitor               0,0        0,00        0,00       1      0,
  .ioctl                 0,0        0,00        0,00       3      0,
  .__ioctl               0,0        0,00        0,00       3      0,
  .isatty                0,0        0,00        0,00       3      0,
  .fwrite                0,0        0,00        0,00       4      0,
  .memchr                0,0        0,00        0,00       4      0,
  .ctime                 0,0        0,00        0,00       1      0,
  .localtime             0,0        0,00        0,00       1      0,
  .gmtime                0,0        0,00        0,00       1      0,
  .asctime               0,0        0,00        0,00       1      0,
  .tzset                 0,0        0,00        0,00       1      0,
  .printf                0,0        0,00        0,00       2      0,
Für dieses sehr einfache Beispiel ist sicher vor allem interessant, welche Funktionen insgesamt für die Abarbeitung des Programms benötigt werden.

gprof

  gprof
Erzeugt Ausführungsprofil eines Programms:
Analysiert wird die Häufigkeits des Aufrufes von Routinen durch das zu analysierende Programm.
gprof liefert umfassendere Angaben als prof.

Um das Ausführungsprofil eines Programms zu erhalten, sind folgende Schritte erforderlich:

  1. Übersetzung des Programms mit der Option pg, z.B.:
       cc -pg -o bsp bsp.c
       
  2. Ausführung des erstellten Programms, z.B.:
       bsp
       
    Im aktuellen Verzeichnis wird eine (binäre) Analysedatei gmon.out angelegt.
  3. Aufruf des Analyseprogramms
       gprof
       
    Das Analyseprotokoll wird auf die Standardausgabe ausgegeben.
    Bemerkung: Durch Umlenkung der Standardausgabe kann das Analyseprotokoll in einer Datei abgespeichert werden.
    gprof bereitet die im vorherigen Schritt erstellte Analysedatei gmon.out auf.
sccs

  sccs ...
Source Code Control System - Versionsverwaltung

od

  od -x filename1 ...
Zeigt eine Datei in Hexadezimaldarstellung an.
Kann zum Beispiel zur Einsicht in Objektcode- oder ausführbare Dateien verwendet werden.

Ohne Angabe einer Option benutzt od Oktaldarstellung (octal dump).

Weitere Aufrufmöglichkeiten:

  od -t a filename           Anzeige als ASCII-Zeichen
  od -t a -x filename        kombinierte Anzeige ASCII - Hexadezimal
adb

  adb ...
Debugger

grep

  grep muster filename1 ...
grep filtert aus den angegebenen Dateien die Zeilen heraus, in denen das angegebene Muster auftritt.

Beispiel:

  grep laenge *.c
Ermittelt die Quelltextdateien, in denen das Muster laenge auftritt und listet die entsprechenden Zeilen auf.
Ist laenge der Name einer Variablen, so kann festgestellt werden, wo diese Variable verwendet wird.
Bemerkung: Da grep keine C-Kenntnisse besitzt, kann es passieren, daß auch Zeilen gelistet werden, welche die Variable laenge nicht enthalten (laenge ist nur ein Textmuster).

strings

  strings filename1 ...
Sucht nach druckbaren Zeichenketten in Objektcode- und ausführbaren Dateien.

make

Unterstützung für Programmprojekte

ifnames

  ifnames filename1 ...
Listet alle Bezeichner auf, die in den angegebenen Quelltextdateien in #if, #elif, #ifdef, oder #ifndef Direktiven verwendet werden.

autoconf

Unterstützung für die Erstellung eines Installationsskripts für Programmsysteme.


Zurück zum Menü
Zurück zur vorigen Seite Weiter zur nächsten Seite

P. Böhme, 12.03.1996