Forum: Compiler & IDEs c++ Code-Analyse Programm


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Georg W. (georg1010)


Bewertung
0 lesenswert
nicht lesenswert
Schönen Nachmittag,
kennt jemand ein Code Analyse Programm, das mir anzeigt (noch besser: 
übersichtlich darstellt - z. B. tabelarisch), in welchen Funktionen 
eines Programms eine globale Variable abgefragt oder geändert wird?

Grüße
georg1010

von Programmierer (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Lösche die Variable aus dem Code, und der Compiler wird es dir sagen.
Am besten wird sie nirgends genutzt, denn globale Variablen sind böse.

von if [ "$a" \< "$b" ] (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Fragment ohne grosses Nachdenken:


find . -name\*.c -exec grep -lo [name_derboesen_globalen_variable]

https://stackoverflow.com/questions/21763904/linux-find-and-grep-command-together

von Programmierer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
if [ "$a" \< "$b" ] schrieb:
> Fragment ohne grosses Nachdenken:

Das Problem dabei ist dass die Variable auch über ein Makro zugegriffen 
werden könnte, welches den Namen zusammensetzt. Dann findet man das so 
nicht. Außerdem könnte es sein dass die Variable eine Klasse mit 
Konstruktor ist, welcher die Instanz irgendwo registriert, sodass der 
Name der Variablen nirgends auftauchen muss, sie aber dennoch 
zugegriffen wird. Deswegen sollte man so etwas gar nicht erst schreiben 
:-)

von Georg W. (georg1010)


Bewertung
-7 lesenswert
nicht lesenswert
Programmierer schrieb:
> Lösche die Variable aus dem Code, und der Compiler wird es dir sagen.
> Am besten wird sie nirgends genutzt, denn globale Variablen sind böse.

Danke dir für diesen Input.
Er hilft mir nur 0 (in Worten: null) weiter.
Grüße

von Programmierer (Gast)


Bewertung
6 lesenswert
nicht lesenswert
Georg W. schrieb:
> Er hilft mir nur 0 (in Worten: null) weiter.

Danke für die präzise Angabe. Die hilft uns super weiter! Gut dass es 
nicht 0.1 (Nullkommaeins) war!

Der Compiler ist das verlässlichste Tool für so etwas. Alle anderen 
Analyse-Tools könnten ggf. durch eventuelle Schweinereien wie Makros 
nicht durchblicken.

von Vincent H. (vinci)


Bewertung
0 lesenswert
nicht lesenswert
Wie wärs mit einer IDE?
Das von dir gesuchte Feature sollte so ziemlich jede IDE seit 1995 
unterstützen...

von Blume (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
con SciTools gibt es:

das Tool "Understand" : Visualize Your Code

hab zwar noch nie damit gerarbeitet aber wer weis. Villeicht hilft es 
dir um deinen Code zu verstehen.

Ich bin mit Clion und der Suche nach Refrenzen sehr zufrieden um die 
gewünnschte Aufgabe zu erledigen.

von Der Dünne (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Georg W. schrieb:
> Schönen Nachmittag,
> kennt jemand ein Code Analyse Programm, das mir anzeigt (noch besser:
> übersichtlich darstellt - z. B. tabelarisch), in welchen Funktionen
> eines Programms eine globale Variable abgefragt oder geändert wird?

Schau dir das .map file an um globale Variablen zu finden. Dann schaue 
in den einzelnen .o files, ob sie ein externes Symbol mit diesem Namen 
referenzieren. Dann grep'pe im Code der entsprechenden Quelldatei.

Alternativ kann man das sicherlich auch mit einem GCC/Clang Plugin 
loesen.

von Hans-Georg L. (h-g-l)


Bewertung
0 lesenswert
nicht lesenswert
Ich mach das mit Notepad ++  suchen in Files

von Sven B. (scummos)


Bewertung
2 lesenswert
nicht lesenswert
Georg W. schrieb:
> Programmierer schrieb:
>> Lösche die Variable aus dem Code, und der Compiler wird es dir sagen.
>> Am besten wird sie nirgends genutzt, denn globale Variablen sind böse.
>
> Danke dir für diesen Input.
> Er hilft mir nur 0 (in Worten: null) weiter.
> Grüße

Ist aber der einzig brauchbare Vorschlag, denn nur der liefert 
zuverlässige Ergebnisse. Das nächstbeste wäre irgendwelches 
clang-Tooling, was in diversen IDEs verbaut ist, mit "Find Uses" o.ä.

Ich weiß auch nicht, was du mit dem Vorschlag für ein Problem hast? Die 
Tatsache, dass du einen Forums-Thread erstellen musst, um zu fragen wie 
du überhaupt rausfinden könntest, wo dein Programm auf deine Daten 
zugreift, zeigt dass das mal refactort werden sollte. Also tu das und 
finde am Schluss die fehlenden Stellen durch Löschen der Variable.

von Rolf M. (rmagnus)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Einfach Doygen drüberlaufen lassen. Mit den richtigen Einstellungen im 
Doxyfile gibt dir das für alle Elemente aus, von wo sie überall 
referenziert werden.

Für folgenden Code sieht das z.B. wie im Anhang aus:
#include <iostream>

int globalvar;

#define MYGLOBAL globalvar

void anderefunktion()
{
    std::cout << globalvar << '\n';
}

int main()
{
    MYGLOBAL = 5;
    anderefunktion();
}

von Irgend W. (Firma: egal) (irgendwer)


Bewertung
0 lesenswert
nicht lesenswert
Sven B. schrieb:
> Georg W. schrieb:
>> Programmierer schrieb:
>>> Lösche die Variable aus dem Code, und der Compiler wird es dir sagen.
>>> Am besten wird sie nirgends genutzt, denn globale Variablen sind böse.
>>
>> Danke dir für diesen Input.
>> Er hilft mir nur 0 (in Worten: null) weiter.
>> Grüße
>
> Ist aber der einzig brauchbare Vorschlag, denn nur der liefert
> zuverlässige Ergebnisse...
> ...Also tu das und
> finde am Schluss die fehlenden Stellen durch Löschen der Variable.

Es gibt dazu auch noch den"mittelgroßen Holzhammer" in dem man die 
Variable nicht löscht sondern nur umbenennt. Der Effekt ist erstmal der 
selbe, nur das man am ende wenn alle Stellen umbenannt sind genau weiß 
wo diese waren und das Programm noch genauso funktioniert wie vorher.
Das ist halt die Strafe dafür wenn man Globale Variablen benutzt und 
diese auch noch mit Makros unkenntlich macht

von A. S. (achs)


Bewertung
0 lesenswert
nicht lesenswert
Irgend W. schrieb:
> Das ist halt die Strafe dafür wenn man Globale Variablen benutzt und
> diese auch noch mit Makros unkenntlich macht

Naja, global wäre sie auch, wenn ich das hinter getter und setter 
Verstecke.

Die Probleme sind eher, wenn die IDE die gleichen Namen alle nicht mehr 
unterscheiden kann, weil tausend namespaces explizit und implizit 
herangezogen werden oder alle Klassen ein doit und x,y und z haben. Eine 
globale Variable mit eindeutigen Namen ist dagegen oft ein Fels in der 
Brandung, wenn man nicht Sabotage (per define etc) betreibt.

Wenn man const sonst richtig und konsequent verwendet, kann man 
Schreibzugriffe auch durch hinzufügen von const finden.

: Bearbeitet durch User
von Mate Rigo (Gast)


Bewertung
1 lesenswert
nicht lesenswert
https://www.sourcetrail.com/
Das ist genau was du brauchst.

von Max (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Linker map-Datei zeigt es.

von Georg W. (georg1010)


Bewertung
0 lesenswert
nicht lesenswert
Mate Rigo schrieb:
> https://www.sourcetrail.com/
> Das ist genau was du brauchst.

Danke dir. Das sieht ja gut aus.

von Mark B. (markbrandis)


Bewertung
0 lesenswert
nicht lesenswert
Irgend W. schrieb:
> Das ist halt die Strafe dafür wenn man Globale Variablen benutzt und
> diese auch noch mit Makros unkenntlich macht

Davon hat der Themenersteller freilich nichts geschrieben.

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.

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