mikrocontroller.net

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


Autor: Chris Herch (hergi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ribak (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cscope oder ctags

Autor: Tobias Korrmann (kurzschluss81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuchs mal mit Doxygen

Autor: Chris Herch (hergi)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris Herch (hergi)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Chris Herch (hergi)
Datum:

Bewertung
0 lesenswert
nicht 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.

void func();
static void func2();


void func()
{

}

void func2()
{

}


Die Ausgabe von ctags:
func  test_func.c  /^void func();$/;"  p  line:1  file:
func2  test_func.c  /^static void func2();$/;"  p  line:2  file:
func  test_func.c  /^void func()$/;"  f  line:5
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:

func  test_func.h  /^void func();$/;"  p  line:1  
func2  test_func.h  /^static void func2();$/;"  p  line:2  
func  test_func.h  /^void func()$/;"  f  line:5  
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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris Herch (hergi)
Datum:

Bewertung
0 lesenswert
nicht 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
// main.c
int main()
{
  func();
  func2();
  return 0;
}

und mit
gcc main.c func.c

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

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.