Analiza przepływu danych obejmuje wiele technik, które koncentrują się na gromadzeniu informacji o różnych zmiennych związanych z systemem. Szczegółowo bada się cykl życia zmiennych, tj. miejsca ich deklaracji, definicji, odczytu, obliczania wartości i niszczenia, ponieważ anomalie mogą wystąpić w każdej z takich operacji.
Jedną z często używanych technik jest notacja definicja-użycie, w której cykl życia każdej zmiennej dzieli się na trzy atomowe działania:
- d (define): gdy zmienna jest deklarowana, definiowana lub inicjowana,
- u (use): gdy zmienna jest używana lub odczytywana w obliczeniach lub w predykacie,
- k (kill): gdy zmienna jest usuwana lub niszczona albo przestaje być dostępna w danym zasięgu.
Trzy powyższe działania atomowe łączone są w pary (tzw. „pary definicja-użycie”), które opisują przepływ danych. Na przykład, ścieżka „du” reprezentuje fragment kodu, w którym zmienna danych jest definiowana, a następnie używana.
Anomalie dotyczące danych to, na przykład, wykonanie poprawnego działania na zmiennej w niewłaściwym momencie lub wykonanie niepoprawnego działania na danych w zmiennej. Przykłady:
- przypisanie niepoprawnej wartości zmiennej,
- brak przypisania wartości zmiennej przed jej użyciem,
- wybór nieprawidłowej ścieżki z powodu niepoprawnej wartości predykatu sterującego,
- próba użycia wartości po zniszczeniu zmiennej,
- odwołanie do zmiennej znajdującej się poza zasięgiem,
- zadeklarowanie i zniszczenie zmiennej bez jej użycia,
- zmiana definicji zmiennej przed jej użyciem,
- brak usunięcia dynamicznie zaalokowanej zmiennej (a w konsekwencji możliwy wyciek pamięci),
- modyfikacja wartości powodująca nieoczekiwane skutki uboczne (np. wynikające ze zmiany wartościzmiennej globalnej bez uwzględniania wszystkich miejsc, w których użyto tej zmiennej).
Używany język programowania może mieć wpływ na zasady stosowane w trakcie analizy przepływu danych. Niektóre języki programowania mogą umożliwiać programistom wykonywanie pewnych działań na zmiennych, które nie są niedozwolone, jednak w pewnych okolicznościach mogą spowodować pracę systemu niezgodną z oczekiwaniami. Na przykład, na jednej ze ścieżek zmienna może być zdefiniowana dwukrotnie i w ogóle nie używana. W trakcie analizy przepływu danych takie sytuacje zostaną sklasyfikowane jako „podejrzane”. Wprawdzie mogą to być dozwolone operacje przypisania wartości zmiennej, jednak w przyszłości są w stanie spowodować problemy związane z pielęgnowalnością kodu.
Testowanie przepływu danych „wykorzystuje diagram przepływu sterowania do wykrycia niespodziewanych sytuacji, w jakich mogą znaleźć się dane” [Beizer90], zatem pozwala wykryć inne rodzaje błędów niż testowanie przepływu sterowania. Techniczny analityk testowy powinien uwzględnić tę technikę podczas planowania testów, ponieważ wiele defektów może doprowadzić do nieregularnych awarii, które trudno wykryć podczas testowania dynamicznego.
Analiza przepływu danych jest jednak techniką statyczną; można w niej pominąć pewne problemy, które dotyczą danych w czasie wykonywania. Na przykład, statyczna zmienna danych może zawierać wskaźnik do dynamicznie tworzonej tablicy, która istnieje jedynie w czasie wykonywania. W przypadku korzystania z wielu procesorów i wielozadaniowości z wywłaszczaniem mogą pojawić się tzw. wyścigi, które nie zostaną wykryte w ramach analizy przepływu danych i przepływu sterowania.