Suche Analysetool für 'tote' Funktionen/Proceduren

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

Antworten
Peter Schweizer
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 153
Registriert: Do, 06. Apr 2006 10:51
Danksagung erhalten: 3 Mal

Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von Peter Schweizer »

Hallo Forumsleser,

ich suche ein Tool, das mir eine Ergebnis-Liste erstellt (oder anzeigt) welche Funktionen/Proceduren in einem gegebenen Programmsystem tatsächlich verwendet werden und welche wahrscheinlich nirgendwo mehr aufgerufen werden.
Hintergrund: Ich muß ein gewachsenes Clipper Programm entrümpeln.

Gibts sowas überhaupt ?

Peter
Gruss Peter
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9357
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von Tom »

Hallo, Peter.

Viele Editoren (z.B. MultiEdit) enthalten eine Baumansicht aller eingebundenen Prozeduren und Funktionen für einzelne PRGs oder alle eines Projekts. Danach muss man nur prüfen, ob es Aufrufe gibt.

Wenn Du - nur testweise - aus dem Erzeugen einer EXE für Xbase++ die Erzeugung einer DLL machst, entsteht über AIMPLIB (wird von PBUILD automatisch aufgerufen) eine .DEF-Datei, die - natürlichsprachlich - alle enthaltenen Funktionen und Prozeduren der vermeintlichen DLL auflistet.

All das ist nicht ganz ungefährlich, weil es Clipper und Xbase++ erlauben, über den Makroexpander Funktionen und Prozeduren auch aufzurufen, ohne dass der eigentliche Code diesen Aufruf enthält. So kann ich Funktionsaufrufe auch in Tabellen speichern und dann per Makro auslösen. Ist diese Funktion dann nicht (mehr) vorhanden, schmiert das Programm ab.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von brandelh »

Die Liste der Funktionen Proceduren kann man ja einfach selbst erstellen, alle PRG und eventuell CH Dateien eines Verzeichnisses (falls alles in einem liegt) nach
FUNC / FUNCTION, PROC / PROCEDURE und CLASS linksbündig nach alltrim() durchsuchen, je nach Compilerschalter dann noch nach
SET PROCEDURE TO ...
STATIC FUNC ... oder STATIC PROC ... vorher alle Blanks auf ein Blank reduzieren ...

Prozeduren können mit DO ... Name aufgerufen werden, Funktionen oder Proceduren dann noch mit Name und ( ... wobei vorher jeweils die Blanks in der Zeile gelöscht werden sollten.
Nun noch die Klassen Aufrufe suchen, Name() bzw. Name():New() ...

Am Schluß muss man nach {| suchen (wieder alle Blanks dazwischen gelöscht) und die codeblocks ansehen, diese könnten natürlich auch aus DBF Dateien geladen bzw. als Text zusammengebaut werden, also zusätzlich alle Stellen mit & durchsehen ob codeblocks erzeugt werden.

Für gebräuchlichere/syntaktisch strengere Sprachen gibt es solche Dokumentationstools, für Xbase++ ist MIR keines bekannt.
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2824
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von georg »

Hallo,


also, mir fällt GROK ein, Autor war wohl John Kaster.

GROK war auf Clipper ausgerichtet, und es gibt ein SourceForge Projekt, in C++ geschrieben, das ähnliche Funktionen wahrnehmen soll:

http://sourceforge.net/projects/lintcheck/

Ich bin kein C++-Experte, aber da das Projekt wohl noch gepflegt wird (letztes Update war dieses Jahr), vielleicht kann es ja jemand so anpassen, dass auch Xbase++ abgebildet wird.

Bezüglich GROK für Clipper:

http://www.prgtools.com/grok.htm
http://compgroups.net/comp.lang.clipper ... are/891422
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von Rudolf »

Hallo,
ich habe mir dazu ein eigenes Tool geschrieben, aber kämpfe noch damit wie ich die Anzahl der Funktionsaufrufe richtig analysiere. Im ersten Durchlauf analysiere ich Sourcedode und include Files, dann gehe die den Sourcecode mit den gefundenen Funktionen durch und prüfe die Anzahl der Aufrufe. Dabei gibt es verschiedene Arten wie die Funktion vorkommen kann, z.B. Funktion test()
function1(test(function3(test))))
var:=test()
var:=1*test()
u.s.w.
Gleiches gilt für Proceduren.
Wie kann ich die Anzahl der Funktionsaufrufe richtig aus dem Sourcecode analysieren ? Ich denke das wird relativ kompliziert.
Grüße
Rudolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von brandelh »

Hi,

du darfst nicht nach TEST() suchen, da ja Parameter darin stehen können.
Ebenso ist von der Syntax Test() und TEST() und Test () identisch, daher muss man die Zeile zunächst UPPER() oder LOWER() setzen und Blanks vor ( entfernen:

Code: Alles auswählen

do while " (" $ cTxt
    StrTran(cTxt, " (", "(")
enddo


Ganz übel wird es, wenn man Functionsnamen abgekürzt hat, wobei ... gilt die "Abkürzung" (FUNC statt FUNCTION) überhaupt für (eigene) Funktionen / Prozeduren ?
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von Manfred »

Hi Hubert,

für eigene nicht. Kann ja auch nicht, woher soll das System wissen, was gemeint ist. Deshalb sind die ja auch reserviert vermute ich mal.

eigeneFunktion1()

eigeneFunktion2()

eigeneFunktion() -> Was sollte da passieren?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von brandelh »

Ich sehe das auch so, war mir aber im Moment etwas unsicher.
Ich selbst schreibe aber schon seit Jahren alles aus.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von brandelh »

Man muss auch die eigenen CH Dateien einer PRG durchsuchen, falls man #define verwendet um Code zu verstecken.

... eventuell wäre das Durchsuchen der PPO sinnvoller ... oder man fragt Alaska ob die sowas nicht über eine intere Funktion erledigen können ... intern müsste es ja sowas wie eine "Liste der Functionen und Prozeduren" geben ...
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von Rudolf »

Hallo,
ich denke dass man es so machen könnte
Grüße
Rudolf

Code: Alles auswählen

function countfu(cLine,cFu)
******************************************************************
local n := 0,aStr := {},x
cLine := lower(cLine)
cFu := lower(cFu)
if !cFu $ cLine
     return 0
endif
aadd(aStr,":=(" + cFu)
aadd(aStr,":= (" + cFu)
aadd(aStr,":=  (" + cFu)

aadd(aStr,"#(" + cFu)
aadd(aStr,"# (" + cFu)
aadd(aStr,"#  (" + cFu)

aadd(aStr,"+=(" + cFu)
aadd(aStr,"+= (" + cFu)
aadd(aStr,"+=  (" + cFu)

aadd(aStr,"-=(" + cFu)
aadd(aStr,"-= (" + cFu)
aadd(aStr,"-=  (" + cFu)

aadd(aStr,"*(" + cFu)
aadd(aStr,"* (" + cFu)
aadd(aStr,"*  (" + cFu)

aadd(aStr,"/(" + cFu)
aadd(aStr,"/ (" + cFu)
aadd(aStr,"/  (" + cFu)

aadd(aStr,"(" + cFu) // rest

for x := 1 to len(aStr)
     n += numat(aStr[x],cLine)
     cLine := strtran(aStr[x],cLine,"")
next x

return n

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von brandelh »

diese Schreibweise hat den Nachteil, dass du bis maximal 2 oder 3 Blanks zwischen den Ereignissen suchst.
Es könnte aber z.B. auch chr(9) oder mehrere Blanks sein. Daher meine Schleife, die immer " (" nach "(" macht.
Natürlich nicht in der richtigen Quelle ;-)
Man könnte aber auch gleich diese chr(9) und doppelten Blanks im SuchTEXT komplett entfernen, das geht schneller ...

Code: Alles auswählen

1. TAB() nach Blank ... strTran(cTxt, chr(9),space(1))
2. space(x) nach space(1) ersetzen !
Hierzu nutze ich oft eine mehrstufige Lösung:

Code: Alles auswählen

do while space(5) $ cTxt ; strTran(cTxt,space(5)," ") ; enddo
do while space(3) $ cTxt ; strTran(cTxt,space(3)," ") ; enddo
do while space(2) $ cTxt ; strTran(cTxt,space(2)," ") ; enddo

Wenn du deinen temporären Quellcode so bearbeitet hast, kannst du dir die Hälte der Durchläufe sparen.
StrTran() ersetzt viele Vorkommen auf einen Schlag und FOR NEXT Schleifen werden massiv gespart.
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von Rudolf »

Hallo Hubert,
danke, guter Tip, ich werde alle Leerzeichen vorher entfernen, dann erledigt sich das Problem
Grüße
Rudolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von brandelh »

Hallo Rudolf,

ich hoffe du hast das richitg verstanden, "mehrfache" auf "ein" Leerzeichen ist richtig, aber ganz weg natürlich nicht ;-)
Wahrscheinlich hattest du das gemeint, aber sicher ist sicher :D
Gruß
Hubert
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von Rudolf »

Hallo Hubert,
ich muss mir nochmal alle Vorkommen von Funktionsaufrufen anschauen, ich muss auch das Zeichen vor dem Funktionsaufruf prüfen, sonst würde ttest( gleich wie test( gezählt werden.
Grüße
Rudolf
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von Magic »

Hi,

nur mal so am Rande. Ich mache es manuell.
Im PSPad editor öffne ich „Dateiübergreifend suchen“. Wähle mein Projektverzeichnis (evtl. sage ich noch Einschließlich Unterordner, etc.) und schwups bekomme ich z.B. eine Liste, dessen wonach ich gesucht habe. Entscheide dann selbst bei der Durchsicht, welche Treffer tatsächlich die für mich relevanten sind.
Natürlich finde ich so nie die eine Funktion, von der ich nicht weiß, dass sie existiert :shock:
I.d.R. kenne ich die Funktionen / Prozeduren, etc. die existieren. Bei sehr großen Projekten / Projektteams und fremd programmierter Software mag dass natürlich anders aussehen. Meine Software gehört eher in die Kategorie „noch durchschaubar“ :)
Gruß,
Magic
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von Rudolf »

Hallo,
aber mit der Methode kannst Du nicht untescheiden zwischen test() und ttest(). Mein Tool macht noch mehr, es kann Texte rausfiltern und mit Funktionen oder defines ersetzen um den Sourcecode mehrsprachig zu machen, Header für Robodoc im Dialog bei Bedarf einfügen und in Datei verwalten, HTML Hilfe aus den Headern erstellen, u.a. Bei ca. 3000 Funktionen in einem Projekt kann man schnell mal die Übersicht verlieren ;-)
Grüße
Rudolf
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von brandelh »

Rudolf hat geschrieben:Hallo Hubert,
ich muss mir nochmal alle Vorkommen von Funktionsaufrufen anschauen, ich muss auch das Zeichen vor dem Funktionsaufruf prüfen, sonst würde ttest( gleich wie test( gezählt werden.
Grüße
Rudolf
genau , "+Test(", "-Test(", " Test(", ...
da bietet es sich an, mit StrTran() NACH "(", "+", "=", "-", "*", "/", etc." jeweils ein Blank einzufügen (über die ganze Datei), dann kann man einfach auf " "+Funktionsname testen.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von brandelh »

Hi,

schaut euch mal CLICK auf http://the-oasis.net/ an ... angeblich kann der auch Xbase++ Code analysieren.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Suche Analysetool für 'tote' Funktionen/Proceduren

Beitrag von AUGE_OHR »

brandelh hat geschrieben:schaut euch mal CLICK auf http://the-oasis.net/ an ... angeblich kann der auch Xbase++ Code analysieren.
"Die" Version von OASIS kann natürlich NUR Cl*pper Code !
Es gibt eine Version von OLAF870 im Alaska Newsforum welche für Xbase++ erweitert wurde die schon einiges kann.

allerdings darf man keine Wunder erwarten den, wie bei SNAP, DOC, DFLOW etc. kann CLICK nicht von alleine Macros auflösen.
man muss also schon den Code mit #SNAPCODE erweitern damit solche Programme arbeiten können.

wenn du dann die Liste der "benutzten" Func / Proc mit denen in der DEF Datei vergleichst dann kannst du die "unbenutzten" finden denn in der DEF Datei sind "alle" Func / Proc ( ausser STATIC )

p.s. ich würde nicht "entmisten" solange das Programm nicht "schon Jahren" in der Form gelaufen ist und man den Source wirklich "kennt".
gruss by OHR
Jimmy
Antworten