Не уверен, что это именно то, что вы имеете в виду, но статические анализаторы, такие как анализ кода clang, определяют все возможные ветви, которые может принять код, и проверяют наличие ошибок. Например, с учетом кода ..
1. if(somefunction()){
2. this_will_break();
3. } else {
4. if(anotherfunction()){
5. printf("%i", str(something));
6. }
7. print("this is fine");
8. }
Вы получите вывод по линиям:
Line 1. Taking true branch.
Line 1. Error: Function this_will_break is not defined
Line 4. Taking true branch.
Line 5. Warning: Function passed incompatible type
Вы могли бы потенциально наметить эти пути, но я не понимаю, почему вы хотели бы (это действительно ничего не показывает)
Другая, возможно, похожая идея - Gprof2Dot , которая берет данные профилирования и рисует иерархическую диаграмму Graphviz, показывающую, сколько времени занимает выполнение каждой функции, какая функция ее вызывала и т. Д.
Последнее, что приходит на ум, это нодальные приложения, такие как Shake или Quartz Composer - способы «визуального программирования», представляющие код наподобие Add(Blur(MyImage), Blur(AlphaChannel))
в виде:
[MyImage]--->[Blur]----\/
[Add]
/\
[AlphaChannel]----------
Это не логические графики, но они представляют собой способы визуального представления кода, которые могут дать вам некоторые идеи ... может быть ... если я не совсем неправильно понимаю ...