$$ \require{color} % Regular operations \def\op#1{ \fcolorbox{black}{white}{$\vphantom{d} \sf{#1}$} } \def\d{\op{d} \\,} \def\a{\op{a} \\,} \def\u{\op{u} \\,} % Erroneous operations \def\opR#1{ \fcolorbox{black}{orangered}{$\vphantom{d} \color{white}{\sf{#1}}$} } \def\dR{\opR{d} \\,} \def\aR{\opR{a} \\,} \def\uR{\opR{u} \\,} % Subscript operations \def\Op#1#2{ \fcolorbox{black}{white}{$\vphantom{d_6} \sf{#1}_{#2}$} } \def\D#1{\Op{d}{#1} \\,} \def\A#1{\Op{a}{#1} \\,} \def\U#1{\Op{u}{#1} \\,} % Warning subscript operations \def\OpW#1#2{ \fcolorbox{black}{orange}{$\vphantom{d_6} \sf{#1}_{#2}$} } % Green subscript operations \def\OpG#1#2{ \fcolorbox{black}{lightgreen}{$\vphantom{d_6} \sf{#1}_{#2}$} } \def\DG#1{\OpG{d}{#1} \\,} \def\AG#1{\OpG{a}{#1} \\,} \def\UG#1{\OpG{u}{#1} \\,} % Error \def\Err{ \color{red}{\sf{ERROR}} } \def\err{ \\, \Err } $$

Analisi Data Flow

Nata nell’ambito dell’ottimizzazione dei compilatori, che per migliorare le proprie performance ricercavano porzioni di codice non raggiungibile da non compilare, l’analisi del flusso di dati è stata più avanti imbracciata dall’ingegneria del software per ricercare e prevenire le cause di errori simili.
Parlando di flusso dei dati si potrebbe pensare a un’analisi prettamente dinamica come il testing, ma l’insieme dei controlli statici che si possono fare sul codice per comprendere come vengono utilizzati i valori presenti nel programma è invece particolarmente significativo.

È possibile infatti analizzare staticamente il tipo delle operazioni eseguite su una variabile e l’insieme dei legami di compatibilità tra di esse per determinare se il valore in questione viene usato in maniera semanticamente sensata all’interno del codice.
Nello specifico, le operazioni che possono essere eseguite su un dato sono solamente di tre tipi:

  • \(\op{d}\) (definizione): il comando assegna un valore alla variabile; anche il passaggio del dato come parametro ad una funzione che lo modifica è considerata un’operazione di (ri)definizione;

  • \(\op{u}\) (uso): il comando legge il contenuto di una variabile, come per esempio l’espressione sul lato destro di un assegnamento;

  • \(\op{a}\) (annullamento): al termine dell’esecuzione del comando il valore della variabile non è significativo/affidabile. Per esempio, dopo la dichiarazione senza inizializzazione di una variabile e al termine del suo scope il valore è da considerarsi inaffidabile.

Dal punto di vista di ciascuna variabile è possibile ridurre una qualsiasi sequenza d’istruzioni (ovvero un cammino sul diagramma di flusso) a una sequenza di definizioni, usi e annullamenti.