Практические различия между графиком потока управления и графиком вызова (потока?)
В Википедии есть определение графа потока управления. Я также слышал терминологию, относящуюся к "графу вызовов (потока?)", Но не могу найти никаких соответствующих ресурсов. Какая связь между ними?
1 ответ
Википедия определяет граф вызовов как представление отношений вызова между подпрограммами в программе. В графе вызовов, ребро между двумя узлами f
а также g
:
f --> g
представляет собой тот факт, что подпрограмма f
вызывает подпрограмму g
, График вызовов дает межпроцедурное представление о программе.
График потока управления (CFG) обеспечивает более тонкие "детали" в структуре программы в целом и подпрограмм в частности. Например, CFG подпрограммы f
сделает явными все пути, которые вызваны условной ветвью:
/ branch1 \
begin --> condition --> --> codeblock --> g --> end
\ branch2 /
Этот вид CFG используется для создания внутрипроцедурного представления подпрограммы.
Графы вызовов (CG) и графы потоков управления (CFG) состоят из узлов и ребер. CG является межпроцедурным, узлы представляют подпрограммы (методы, функции, ...), в то время как ребра представляют отношения, вызываемые вызывающим абонентом, между двумя подпрограммами (например, A->B, "A" - это подпрограмма вызывающего абонента, а "B" - это называется подпрограммой). CFG является внутрипроцедурным, узлы представляют собой операторы программы, в том числе вызываемые подпрограммы, а также условные выражения, а ребра представляют собой поток программы. Когда CG и CFG объединяются, это называется межпроцедурным графом потока управления (ICFG). Генерация CFG более ресурсоемкая, чем CG, но более подробная.