SISSy Code Analyse

Aus SDQ-Wiki

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