Seite 1 von 1

Kontrollflussgraph & Datenfluss-Attribute

Verfasst: 16. Jul 2011 19:00
von oren78
Hallo zusammen,

ich hätte da eine kleine Frage bzgl. der Annotierung des Kontrollflussgraphen mittels der Datenfluss-Attribute.
Angenommen die folgenden Codezeilen wären gegeben:

Code: Alles auswählen

21  while(x != s){
22  // do something...
23  }
würde man für den Knoten 21 dies hier angeben: \(c(s), c(x), p(s), p(x)\) oder etwa nur \(p(s), p(x)\) oder vielleicht was ganz anderes?
Man "benutzt" ja immerhin beide Variablen, sodass die Angabe von \(c(s), c(x)\) eigentlich erforderlich ist, oder? Ich frage daher weil ich
eine Musterlösung vor mir habe, die nur mit den predikativen Attribute \(p(s), p(x)\) auskommt ;-)

Re: Kontrollflussgraph & Datenfluss-Attribute

Verfasst: 16. Jul 2011 23:51
von nogood
Ich verstehe das so, dass nur p(x) und p(s) notwendig sind.
Ein c(x),c(s) Zugriff wäre Beispielsweise notwendig bei

Code: Alles auswählen

20 t = x != s;
21 while (t) ..
wobei noch zusätzlich für Zeile 20 d(t) und für Zeile 21 schließlich p(t) gelten würde.

Da aber in deinem Fall das Ergebnis direkt darüber entscheidet was der nächste Knoten des Kontrollflussgraphen ist, oder "zur Ermittlung eines Wahrheitswertes in einer Entscheidung"(s.u.) verwendet wird,
sollte das ein rein prädikativer Zugriff sein.

Ich glaube in diesem Fall hält sich Professor Schürr an den Liggesmeyer in dem es heißt:
Lesende Zugriffe bezeichnet man als Referenz. In der Programmierung gibt es zwei mögliche Ursachen für lesende Zugriffe auf Variablen. Entweder dient der gelesen Variablenwert als Eingabedatum einer Berechnung oder zur Ermittlung eines Wahrheitswertes in einer Entscheidung. Die erstgenannte Form des Zugriffs bezeichnet man als berechnende Benutzung [...]. Die letztgenannte Form des lesenden Zugriffs bezeichnet man als prädikative Benutzung[...].
Gruß,
Leo

Re: Kontrollflussgraph & Datenfluss-Attribute

Verfasst: 17. Jul 2011 01:16
von oren78
nogood hat geschrieben:Ich verstehe das so, dass nur p(x) und p(s) notwendig sind. Ein c(x),c(s) Zugriff wäre Beispielsweise notwendig bei

Code: Alles auswählen

20 t = x != s;
21 while (t) ..
wobei noch zusätzlich für Zeile 20 d(t) und für Zeile 21 schließlich p(t) gelten würde.

Da aber in deinem Fall das Ergebnis direkt darüber entscheidet was der nächste Knoten des Kontrollflussgraphen ist, oder "zur Ermittlung eines Wahrheitswertes in einer Entscheidung"(s.u.) verwendet wird, sollte das ein rein prädikativer Zugriff sein.
Hmmm...also ich bin da nicht soooo ganz überzeugt, wenn beispielsweise in einer print-Anweisung eine Variable wie folgt auftaucht:

Code: Alles auswählen

System.out.println("The result of a is: " + a);
dann haben wir auch ein compute(a) Attribut, obwohl da eigentlich nichts berechnet wird, sondern eben nur gelesen...also genau wie bei einem Schleifenrumpf, bzw. if-Statement. Daher wollte ich hier sichergehen was nun korrekt wäre. Für die Ermittlung der Annomalien ist es eigentlich egal, würde mich aber dennoch intressieren ;-)

Re: Kontrollflussgraph & Datenfluss-Attribute

Verfasst: 17. Jul 2011 12:59
von nogood
obwohl da eigentlich nichts berechnet wird
Je nachdem wie du gerade den Begriff "berechnet" verwendest wird durchaus was berechnet und zwar der zusammengesetzte String und auch die Ausgabe ist eine Berechnung.

Du darfst natürlich die selben Begriffe für verschiedenen Kontexte nicht durcheinander werfen.
Ersteinmal ist ein lesender Zugriff im Kontext von [cp]-uses eine Zusammenfassung beider Zugriffsarten.
Li09, S. 142 hat geschrieben: Lesende Zugriffe bezeichnet man als Referenz. In der Programmierung gibt es zwei mögliche Ursachen für lesende Zugriffe auf Variablen. Entweder dient der gelesene Variablenwert als Eingabedatum einer Berechnung oder zur Ermittlung eines Wahrheitswertes in einer Entscheidung.
Bezogen auf diese Definition hast du einen Widerspruch in deiner Aussage
oren78 hat geschrieben: obwohl da eigentlich nichts berechnet wird, sondern eben nur gelesen
da, *captainobviousmode* "gelesen" = {"berechnen","entscheiden"} und du quasi sagst "berechnen" \(\not\in\) "gelesen".

Laut Liggesmeyer liegt dann wenn wir einen lesenden Zugriff haben immer auch ein c- oder p-use vor. In beiden Fällen kann man natürlich sagen, dass etwas vom Computer berechnet wird, aber die Entscheidung um welches Datenflussattribut es sich handelt hängt schließlich von der Verwendung dieser Berechnung ab.
Und wenn es sich nicht um einen p-use handelt muss es ein c-use sein.

[Li09] : Peter Liggesmeyer, Software Qualität, 2009

edit: hab die falsche Verwendung des Teilmengensymbols korrigiert ^ ^, lang her mit FGI/Mathe und so

Re: Kontrollflussgraph & Datenfluss-Attribute

Verfasst: 17. Jul 2011 13:07
von oren78
nogood hat geschrieben: Laut Liggesmeyer liegt dann wenn wir einen lesenden Zugriff haben immer auch ein c- oder p-use vor. In beiden Fällen kann man natürlich sagen, dass etwas vom Computer berechnet wird, aber die Entscheidung um welches Datenflussattribut es sich handelt hängt schließlich von der Verwendung dieser Berechnung ab.
Und wenn es sich nicht um einen p-use handelt muss es ein c-use sein.
Also kurz und bündig, in Schleifen / If-Bedingungen auf c() Attribute verzichten und stattdessen nur p() Attribute verwenden? ;-)

Re: Kontrollflussgraph & Datenfluss-Attribute

Verfasst: 18. Jul 2011 00:46
von nogood
oren78 hat geschrieben:Also kurz und bündig, in Schleifen / If-Bedingungen auf c() Attribute verzichten und stattdessen nur p() Attribute verwenden?
Das sollte in den meisten Fällen genügen schätze ich, aber es sind ja auch Anweisungen der Form möglich:

Code: Alles auswählen

if( x = a || b){
...
Wo ich mir jetzt auch nicht ganz sicher wäre aber vermuten würde, dass wir ein p(x) und ein c(a) und c(b) hätten.