Forum: PC Hard- und Software Tool, Skript o.ä. zum Auflisten aller Variablen gesucht


von Chris H. (hergi)


Lesenswert?

Hallo,


Ich bin auf der Suche nach einem Programm oder Skript oder ähnlichem, 
was mir zu gegebenen C-Sourcecode Dateien eine Auflistung von allen 
Variablen und Funktionen etc. mit Typ und Name erstellt.

Das Ergebnis sollte auch Informationen wie Gültigkeitsbereich etc. 
liefern, ungefähr so irgendwie:

ganzeZahl int local variable
ganzeGlobaleZahl int global variable
funcReturnsChar char local function
pointerToFloat float* local variable


Einige Entwicklungsumgebungen, wie Eclipse z.B. bieten ja solche 
Navigator-Fenster, die ungefähr diese Informationen anzeigen, aber 
meistens kann man diese nicht in eine Textdatei oder sowas exportieren.

Kennt jemand ein Tool, mit dem das geht?

Außerdem müssten doch die Parser von C-Compilern auch sowas ähnliches 
erstellen, gibt es vielleicht einen Parser, der mir sowas ausspuckt?

Doxygen erfüllt die Anforderungen ja fast mit dem xml-Export. Leider 
werden da nicht alle lokalen Variablen, also Stack-Variablen angezeigt. 
Kann man das irgendwie umkonfigurieren, so dass wirklich ALLE Variablen 
aufgelistet werden?


mfg, Chris

von Ribak (Gast)


Lesenswert?

cscope oder ctags

von Tobias K. (kurzschluss81)


Lesenswert?

Versuchs mal mit Doxygen

von Chris H. (hergi)


Lesenswert?

Danke für die Antworten erstmal.

Wie ich Cscope für die Aufgabe einsetzen soll konnte ich mir bis jetzt 
noch nicht erschließen, könntest du das ein bisschen näher erläutern?

Ctags dagegen sieht ja schonmal ganz gut aus, was da rauskommt =)
Allerdings werden dort scheinbar leider auch nicht die Variablen, die 
innerhalb von Funktionen genutzt werden, aufgelistet...


An Doxygen hab auch bereits gedacht, wie im ersten Post steht, aber dort 
ist das Problem das gleiche wie bei Ctags.

von Chris H. (hergi)


Lesenswert?

Ich schon wieder... ^^

Also ctags löst die Aufgabe schon ganz gut, man kann es auch so 
konfigurieren, dass auch lokale Variablen angezeigt werden.

Einzig die Variablen in Funktionsschnittstellen zeigt das Tool nicht an. 
Habe bereits das manual durchsucht aber scheinbar gibt es keine Option 
dafür. Kennt jemand nen Trick wie man ctags dazu bringt es doch zu tun?
Oder kennt jemand vll noch ein anderes, besseres Tool?

von Chris H. (hergi)


Lesenswert?

hallo,

komischerweise zeigt mir ctags bei diesem (vereinfachten) Beispiel an, 
dass beide Funktionen file scope hätten, d.h. nur in diesem Sourcefile 
bekannt seien.

1
void func();
2
static void func2();
3
4
5
void func()
6
{
7
8
}
9
10
void func2()
11
{
12
13
}


Die Ausgabe von ctags:
1
func  test_func.c  /^void func();$/;"  p  line:1  file:
2
func2  test_func.c  /^static void func2();$/;"  p  line:2  file:
3
func  test_func.c  /^void func()$/;"  f  line:5
4
func2  test_func.c  /^void func2()$/;"  f  line:10

Man sieht, dass die Prototypen mit scope "file" erkannt werden, die 
Definitionen dann aber nicht (also global). Allerdings passiert das nur, 
wenn ich den code in einer *.c Datei speichere.
Speichere ich ihn in einer *.h Datei sieht das Ergebnis anders aus:

1
func  test_func.h  /^void func();$/;"  p  line:1  
2
func2  test_func.h  /^static void func2();$/;"  p  line:2  
3
func  test_func.h  /^void func()$/;"  f  line:5  
4
func2  test_func.h  /^void func2()$/;"  f  line:10

Jetzt werden beide Funktionen als global erkannt, obwohl die eine mit 
"static" ja nur in dieser Datei sichtbar wäre, also eigentlich das 
"file" Attribut haben müsste...


Jetzt die Frage, hab ich nen Bug entdeckt oder übersehe ich irgendwas 
und das Programm arbeitet einwandfrei?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Sofern es keine Funktionsprototypen in einer Headerdatei gibt, sind die 
Funktionen tatsächlich nur im "file scope" definiert, allerdings gibt es 
"Zusammenstöße" auf Linkerebene, wenn mehrere solche Sourcemodule als 
nicht-statisch verwendete gleiche Symbolnamen verwenden.

Das Schlüsselwort static hat eigentlich nichts in einer Headerdatei 
verloren.

von Chris H. (hergi)


Lesenswert?

Danke für die Antwort!

Versteh das aber nicht so ganz, ich dachte immer wenn eine Funktion ohne 
static deklariert wird, ist sie global sichtbar, auch ganz ohne 
Headerdatei.

Hab jetzt im manual versteckt nen Hinweis auf die Sache gefunden:

[quote]Any tag which is located in a non-include file and cannot be seen 
(e.g. linked to) from another file is considered to have file-limited 
(e.g. static) scope. No kind of tag appearing in an include file will be 
considered to have file-limited scope.[/quote]

Die Funktion func() in meinem Beispiel ist aber doch auch für andere 
Dateien sichtbar.
Habs einfach mal probiert mit
1
// main.c
2
int main()
3
{
4
  func();
5
  func2();
6
  return 0;
7
}

und mit
1
gcc main.c func.c

bekomm ich nur den Fehler für func2():
1
F:\DATEN>gcc main.c test_func.c
2
/cygdrive/c/DOKUME~1/ENTWSO~1/LOKALE~1/Temp/cc4dXpRp.o:main.c:(.text+0x30): undefined reference to `_func2'
3
collect2: ld returned 1 exit status

ohne den Aufruf von func2() kompilierts und läufts einwandfrei.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.