Avatar billede danielmuhlig Nybegynder
27. november 2003 - 10:18 Der er 14 kommentarer

Værktøj til at finde død kode

Findes der et freeware/shareware værktøj, der kan analysere en bunke source filer og finde metoder, variabler osv., der ikke bliver brugt?

Det drejer sig i første omgang om ca. 100 source filer fordelt i 7 packages med et væld af interfaces...
Avatar billede b.b Nybegynder
27. november 2003 - 10:20 #1
Mener du ligesom de programmer man kan få som kan læse html.filer igennem for "døde" links osv..??
Avatar billede danielmuhlig Nybegynder
27. november 2003 - 10:34 #2
Jeg mener et program, der kan søge java source filerne igennem og finde variabler, der aldrig bliver brugt og metoder, der aldrig bliver kaldt.

Jeg har omstruktureret koden og kopieret eller flyttet metoder mellem klasser og pakker. Der kan være metoder og variabler, jeg har glemt at slette, og som nu aldrig vil blive kaldt.

Jeg ønsker at undgå st skulle finde dem manuelt :-)

Det skal være på source niveau. Med andre ord har jeg ikke brug for et program, der kigger på afviklingen af koden for at se, hvad der ikke bliver brugt. Jeg vil vide, hvad der aldrig KAN blive kaldt.

Jeg kender ikke til de programmer, du nævner mht. html...
Avatar billede trolle Nybegynder
27. november 2003 - 10:44 #3
hmmm, idet java har maader at 'dynamisk loade kode' paa under udfoersel, kan man vil egentlig ikke lave et program der 100% sikkert kun fjerner doed kode...
Avatar billede arne_v Ekspert
27. november 2003 - 10:53 #4
Nyere versioner af Eclipse  markerer den slags, men du vil vel helst
undgå at åbne 100 filer i Eclipse.

:-)

Lidt søgning på Google fandt følgende produkt:
  http://pmd.sourceforge.net/

Du kan jo prøve og se om det kan hjælpe dig.
Avatar billede danielmuhlig Nybegynder
27. november 2003 - 13:22 #5
arne_v:
Jeg har kigget på PMD. Den kan godtnok finde døde private metoder og variabler - men det er de public metoder og variabler, der er det største problem.

...og som trolle skriver, kan det sikkert ikke engang laves, da man kan kalde metoder via reflektion.

...er der andre ideer rundt omkring?
Avatar billede arne_v Ekspert
27. november 2003 - 13:31 #6
Normalt vil man være meget forsigtig med at fjerne noget public, fordi
hvad nu hvis et eller andet alligevel bruger det. Ikke kun via
reflection, men også ekstern kilde kode.
Avatar billede danielmuhlig Nybegynder
27. november 2003 - 13:49 #7
Korrekt, men mine metoder tilgås via interfaces, så når jeg fjerner signaturen fra interfacet, så burde ingen udefra kunne kalde metoden - ihvert fald ikke på en dokumenteret måde.

Jeg kunne dog sagtens selv kalde dem indefra, så derfor vil jeg gerne have et stykke software til at finde dem, som #1: ikke kan tilgås via implementerede interfaces og #2: ikke bliver kaldt fra komponenten selv (hvor 'komponenten selv' dækkes de filer, der skal checkes).

Det er let nok manuelt at fjerne de metoder, der ikke er på interfacet, men måske bruger jeg dem selv. Jeg kunne så rekompilere det hele hver gang jeg fjerner/udkommenterer en metode, men det er en ret langsommelig process.

:-)
Avatar billede arne_v Ekspert
27. november 2003 - 13:56 #8
Et andet approach var at bruge noget som:
  http://sourceforge.net/projects/proguard/
  http://proguard.sourceforge.net/

-printusage ser interessant ud !
Avatar billede danielmuhlig Nybegynder
27. november 2003 - 15:08 #9
Nope! Den arbejder på bytecode niveau. Jeg vil have ryddet op i mine source filer, så jeg ikke sidder og vedligeholder og dokumenterer metoder og variabler, der aldrig bliver brugt :^>
Avatar billede arne_v Ekspert
27. november 2003 - 15:29 #10
Ja og ?

du har dine .java filer, du compiler, proguard analyserer dine
.class filer og fortæller dig hvad der ikke bliver brugt, du ved
hvilke .java filer du skal rette i, eller ?
Avatar billede danielmuhlig Nybegynder
27. november 2003 - 16:58 #11
Nu kender jeg jo ikke proguard, men den type programmer plejer ikke at 'fortælle' noget. De går som regel blot ned i .class filen og fjerner det, der ikke bliver brugt.
Avatar billede arne_v Ekspert
27. november 2003 - 17:16 #12
-printusage  [filename]

    Specifies to list dead code of the input class files. The list is printed to the standard output or to the given file. For example, you can list the unused code of an application. Only applicable when shrinking.

Finding dead code
These options list unused fields and methods in the application mypackage.MyApplication:

-libraryjars <java.home>/lib/rt.jar
-injars      in.jar
-dontobfuscate
-printusage

-keep public class mypackage.MyApplication {
    public static void main(java.lang.String[]);
}

We're not specifying an output jar, just printing out some results.

We're saving a little bit of time by not passing through the obfuscation phase. 

------------------------

De lyder da som lidt af det rigtige !
Avatar billede danielmuhlig Nybegynder
28. november 2003 - 09:42 #13
Jeg har nu leget lidt med proguard, men fik den ikke til at køre rigtigt. Den forlanger, at alt ligger i jar filer, hvilket ikke er tilfældet for mig. Derudover skal den have reference til alle de klasser, der refereres til. Jeg kan ikke nøjes med rt.jar som i eksemplet - jeg har flere tusinde klasser spredt ud over både jar- og class-filer.
Avatar billede eydun Nybegynder
08. marts 2004 - 17:10 #14
Du kan selvfølgelig bruge eclipse/proguard/etc. til at lave en statisk analyse på metoder/variable for at se hvilke ikke bliver refereret. Men det er ikke muligt at lave et generelt værktøj til at finde al "død kode".

Søg evt. på google efter: "unreachable code" og "halting problem"
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester