函式呼叫图

en用Python程式产生的函式呼叫图
函式呼叫图（call graph，也称为call multigraph），属于控制流图，可以展示计算机程序中函式之间的关系。每一个节点是一个函式，每一个边(f, g)表示函式f呼叫函式g。若其中有出现互相呼叫的环，表示程式中可能有递回呼叫。

**基本概念**
函式呼叫图可以由动态程式分析产生（动态函式呼叫图），也可以由静态程式分析产生（静态函式呼叫图）。动态函式呼叫图是程式执行过程的记录，可能是效能分析工具所输出的。动态函式呼叫图可以准确的描述这次程式执行时,各函式之间的关系。但会遗漏这次没有执行到的程式码。静态函式呼叫图则是设法表示所有可能执行情形下，所有函式之间的关系。准确的静态函式呼叫图是不可判定问题，因此静态函式呼叫图是多半只是近似情形。函式呼叫图上有所有函式之间的呼叫关系，但有可能其中有一些呼叫是永远不会执行到的。
函式呼叫图可以定义来呈现不同程度的准确度。更准确的函式呼叫图会更近似真正程式的行为，不过要计算的时间会比较长，要储存的资料也会比较多。最准确的函式呼叫图是完全「上下文相关」（context-sensitive），针对每一个函式，图中会对不同情形，不同呼叫堆叠下的呼叫，有不同的节点。全上下文相关的函式呼叫图称为calling context tree。利用动态程式分析可以轻易的产生，不过会花许多的记忆体。呼叫上下文树一般不会用静态程式分析产生，因为对大型程式会花许多时间。最不准确的函式呼叫图称为「上下文无关」（context-insensitive），针对每一个函式只会有一个节点。
若程式语言中有动态分派的特性（例如Java或C++）,要产生准确的静态程式分析会需要alias analysis的结果。相对的，要得到准确的假名分析也需要函式呼叫图。许多静态分析系统可以同步产生这二份资料，解决这个看似无限回圈的问题。

**用途**
函式呼叫图有几种不同的用途。其中一个简单的应用是找出没有被其他程式呼叫的子函式。函式呼叫图可以当做文件，有助于程式设计师的程式理解。函式呼叫图也是进一步分析的基础，例如追踪某一变数数值在各子函式中的变化，或是进行变更影响分析。函式呼叫图可以用来侦测异常的程式执行，或是侦测代码注入攻击。

**范例的图**
以下是用gprof自我分析得到的函式呼叫图
index    called     name                              
index    called     name
72384/72384       sym_id_parse 54             
1508/1508        cg_dfn 15
3   72384             match 3                     
13   1508             pre_visit 13
----------------------                                
4/9052        cg_tally 32                 
1508/1508        cg_assemble 38
3016/9052        hist_print 49               
14   1508             propagate_time 14
6032/9052        propagate_flags 52          
4    9052             sym_lookup 4                
2             cg_dfn 15
----------------------                                
1507/1507        cg_assemble 38
5766/5766        core_create_function_syms 41|15   1507+2           cg_dfn 15
5    5766             core_sym_class 5            
1509/1509        is_numbered 9
----------------------                                
1508/1508        is_busy 11
24/1537        parse_spec 19               
1508/1508        pre_visit 13
1513/1537        core_create_function_syms 41|       1508/1508        post_visit 12
6    1537             sym_init 6                  
2             cg_dfn 15
----------------------                                
1511/1511        core_create_function_syms 41|       1505/1505        hist_print 49
7    1511             get_src_info 7              
16   1505             print_line 16
----------------------                                
2/9           print_name_only 25
2/1510        arc_add 31                  
1508/1510        cg_assemble 38              
1430/1430        core_create_function_syms 41
8    1510             arc_lookup 8                
17   1430             source_file_lookup_path 17
----------------------                                
1509/1509        cg_dfn 15                   
24/24          sym_id_parse 54
9    1509             is_numbered 9               
18     24             parse_id 18
----------------------                                
24/24          parse_spec 19
1508/1508        propagate_flags 52          
10   1508             inherit_flags 10            
24/24          parse_id 18
----------------------                                
19     24             parse_spec 19
1508/1508        cg_dfn 15                   
24/1537        sym_init 6
11   1508             is_busy 11                  
----------------------                                
24/24          main 1210
1508/1508        cg_dfn 15                   
20     24             sym_id_add 20
12   1508             post_visit 12               

**相关条目**
Dependency graph
*功能树