Datenfluss

Wolfsbein

Erfahrenes Mitglied
Hallo

ich suche ein Tool/API um aus Java-Bytecode einen Datenfluss-Graph zu erhalten. Irgendjemand muss das doch schon gemacht haben? Und ich meine keine abstrakte Arbeit oder eine Kruecke, sondern voll funktionsfaehig inklusive aller OO-Spezialitaeten. Google sagt dazu nicht besonders viel, ausser einem Patent auf eine Methode, um den Datenluss-Graphen zu erzeugen.
Angeblich soll der Java bytecode verifier sowas generieren, aber ich habe keine genaueren Informationen dazu gefunden. Irgendwelche Ideen? Danke.
 
Hallo,

willst du alle Möglichen Codepfade haben - Mit Execptions? Warum?
Beschreib doch mal etwas genauer was du eigentlich machen möchtest.

Dann würde ich mich mal bei SSCA (Static Source Code Analysis) Tools bzw. bei normalen Java Compilern umschauen, die machen ja zum Teil Datenflussanalyse um Programmierfehlern entgegenzuwirken (unreachable statements) und um verschiedene Optimierungen durchzuführen.

Ansonsten wird man mit den Stichworten
Control Flow Graph
Code Path Graph

Beispielsweise:
http://cs.sookmyung.ac.kr/~chang/papers.html
http://cs.sookmyung.ac.kr/~chang/pub/asian01.pdf
http://cs.sookmyung.ac.kr/~chang/pub/lncsjo.pdf

Dort wird dann jedoch speziell der C-Flow bei Exceptions analysiert.
Tools die "alle" Codepfade direkt visualisieren könnenn habe ich nicht nicht gesehen.



Gruß Tom
 
Ich brauche den Datenfluss-Graph um festzustellen von wo eine Variable ueberall beeinflusst werden kann, konkret ein String.
Es gibt in den fastdebug-Version von Java 6 sogar eine Option. Mit
Code:
java -XX:+PrintCFGToFile Klasse

kann man sich das ausgeben und mit https://c1visualizer.dev.java.net/ sogar sehr schoen visualisieren. ABER: die fastdebug Version stuerzt bei einem simplen Hello World Programm ab!
 
Hallo,

also bei mir (Windows Vista JDK 1.6u14ea Fastedbug)
funktioniert folgendes Beispiel einwandfrei:
Java:
package de.tutorials.training;

import java.util.Random;

public class CodePathExample {
  static int value;

  public static void main(String[] args) {
    final Random random = new Random();
    for (int i = 0; i < 100000; i++) {
      compileMe(random);
    }
  }

  private static void compileMe(Random random) {
    switch (random.nextInt(3)) {
      case 0:
        a();
        break;
      case 1:
        b();
        break;
      case 2:
        c();
        break;
    }
  }

  private static void c() {
    // System.out.println("c");
    value ^= 'c';
  }

  private static void b() {
    // System.out.println("b");
    value ^= 'b';
  }

  private static void a() {
    if (System.currentTimeMillis() % 3 == 0) {
      // System.out.println("a");
      value ^= 'a';
    } else {
      // System.out.println("ax");
      value ^= 'x';
    }
  }
}

CPG Beispiel Code Path Graph (.cfg) im Anhang.

Gruß Tom
 

Anhänge

Danke ich habs gerade noch gemerkt. Edit eine Minute vor dir :D. Welch Schmach. Kommt davon wenn man ewig kein Java auf der Konsole gemacht hat.
 
Zurück