SISSy Code Analyse
Quellcode-Analysen mit SISSy
Man kann die SISSy-Datenbank dazu verwenden, um statische Quellcode-Analysen durchzuführen.
- Grundlegendes zum Verständnis der SISSy-Datenbank
- Mit SISSy werden Java- oder C/C++-Programme extrahiert und in Form eines generalisierten abstrakten Syntax-Baum (GAST) in der Datenbank abgelegt.
- Dieses Modell enthält Informationen über Typen (Klassen, Schnittstellen ...), Funktionen (Methoden, Konstruktoren, Destruktoren, Globale Funktionen), Variablen (Felder, Formale Parameter, Lokale Variablen, ...), Statements (Kontrollflusselemente innerhalb von Funktionen), sowie Zugriffsbeziehungen (Accesses) (= Funktionsaufrufe, Typreferenzierungen, Variablenzugriffe).
- Die Datenbank enthält eine Tabelle tmodelelements, in der für jedes GAST-Modelelement einen Datensatz (eine Zeile) enthalten ist. In der Spalte kindofelement wird der Elementtyp angegeben.
- Alle Konstanten (Typnummern, etc.) werden in der Tabelle tconstants erläutert, beispielsweise haben laut tconstants normale Klassen die Typkennzahl 35.
- Jedes Modellelement hat je nach Typ noch weitere Datensätze in anderen Tabellen, d.h. Funktionen werden in tfunctions genauer beschrieben, Typen in ttypes, Variablen in tvariables, Statements in tstatements und Accesses (Zugriffsbeziehungen) in taccesses.
- Wie findet man zu einem Modellelement die Quellcode-Position?
- Modellelemente, die eine Quellcode-Repräsentation besitzen haben einen Datensatz in tsourceentities. Die Spalte sourcefileid der Tabelle tsourceentities gibt die dazugehörige Datei an, die durch die Tabelle tfiles identifiziert werden kann.
- Will man beispielsweise alle Methoden mit der dazugehörigen Dateiposition auflisten, kann man folgende SQL-Query verwenden:
select * from tfunctions F join tsourceentities SE on F.id = SE.id join tfiles FL on FL.id = SE.sourcefileid;
- Abhängigkeitsanalysen über Zugriffsbeziehungen:
- Die Tabelle taccesses enthält Zugriffsbeziehungen im Quellcode. Die Zugriffsbeziehung besteht zwischen einer source und einem target. Dem entsprechend besitzt die Tabelle taccesses die Spalten sourceid und targetid. Im folgenden werden an Hand von Beispielabfragen verschieden Analysefragen beantwortet.
- Welchen Typ besitzt das jeweilige Target?
select A.targetid, M.id, C.name As KindOfElement from taccesses A join tmodelelements M on (M.id = A.targetid) join tconstants C on (C.value = M.kindofelement);
- Die weiteren Spalten von taccesses namentlich packageid, classid, functionid, statementid geben an, an welcher Stelle der Aufruf bzw. die Referenzierung stattfindet.
- Da die Aufrufstellen nicht immer vollständig ermittelt werden gibt es häufig Einträge mit -1. Über andere Tabellen lässt sich diese Information jedoch teilweise auch ermitteln. Eine berechnete Sicht mit möglichst vollständiger Information liefert zum Beispiel folgende Abfrage:
create table accessrelations as ( select distinct MM.*, FF.id As FileId, FF.pathname As FilePath, MT.kindofelement As TargetKind, C.name As TargetKindName, MT.name As TargetName from (select distinct A.targetid as TargetId, A.sourceid As SourceId, -100 As StatementId, A.functionid As FunctionId, A.classid as ClassId from taccesses A union select distinct A.targetid as TargetId, A.sourceid As SourceId, S.id As StatementId, S.functionid As FunctionId, -100 As ClassId from taccesses A join tstatements S on S.id = A.sourceid union select distinct A.targetid as TargetId, A.sourceid As SourceId, -100 As StatementId, F.id As FunctionId, F.classid As ClassId from taccesses A join tfunctions F on F.id = A.sourceid union select distinct A.targetid as TargetId, A.sourceid As SourceId, -100 As StatementId, -100 As FunctionId, T.id As ClassId from taccesses A join ttypes T on T.id = A.sourceid union select distinct A.targetid as TargetId, A.sourceid As SourceId, -100 As StatementId, V.functionid As FunctionId, V.classid As ClassId from taccesses A join tvariables V on V.id = A.sourceid) MM join tsourceentities SE on SE.id = MM.sourceid join tfiles FF on FF.id = SE.sourcefileid join tmodelelements MT on MT.id = MM.targetid join tconstants C on C.value = MT.kindofelement);
Ein weiterer Gruppierungsschritt:
create table accessrelationsmerged as select targetid, sourceid, max(statementid) as statementid, max(functionid) as functionid, max(classid) as classid, fileid, filepath, targetkind, targetkindname, targetname from accessrelations group by targetid, sourceid, fileid, filepath, targetkind, targetkindname, targetname;
- Analyse-Arten:
- Analyse der Include-Beziehungen
- Analyse der Zugriffsbeziehungen (Accesses)
- Analyse der Signature-Veränderungen
- Analyse der Gekapselten/Versteckten Änderungen
- Analyse der Änderungspropagierung entlang der Funktionsaufrufkette