一个调用图call graph
(也称为call multigraph
[1] [2])是一种控制流图[3],它表示一个计算机程序中子程序之间的调用关系。每个节点表示一个过程,每条边(f, g)
表示过程f
调用过程g
。因此,图中的一个循环表示递归过程调用。
调用图可以是动态的,也可以是静态的[4]。一个动态调用图是程序一次执行的记录,例如一个分析器的输出。因此,一个动态调用图可以是精确的,但只能描述程序的一次运行。一个静态调用图是一个调用图,用于表示程序的每一次可能运行。准确的静态调用图是一个不可判定的问题,因此静态调用图算法通常是过度近似的。也就是说,发生的每个调用关系都在图中表示出来,而且可能还有一些调用关系在程序的实际运行中永远不会发生。
可以定义调用图来表示不同程度的精度。一个更精确的调用图更精确地近似于真实程序的行为,代价是计算时间更长,存储内存更大。这个最精确的调用图是完全上下文敏感的,这意味着对于每个过程,这个图为每个调用堆栈包含一个单独的节点,可以使用该调用堆栈激活该过程。完全上下文敏感的调用图称为调用上下文树。这可以很容易地动态计算,尽管它可能占用大量内存。调用上下文树通常不是静态计算的,因为对于大型程序来说,这会花费太长时间。最不精确的调用图是上下文不敏感的,这意味着每个过程只有一个节点。
使用具有动态分派特性的语言,如Java和c++,计算静态调用图精确地需要别名分析结果。相反,计算精确的别名需要一个调用图。许多静态分析系统通过同时计算这两种方法来解决视无穷回归问题。
调用图可以被以不同的方式使用。调用图的一个简单应用是查找从未被调用的过程。调用图可以作为人类来理解程序[6]的文档。它们还可以作为进一步分析的基础,例如跟踪过程之间的值流的分析,或者变更影响预测[7]。调用图还可以用来检测程序执行的异常或代码注入攻击。
Visual Basic代码的静态代码分析器和调用图生成器
用于Oracle PL/SQL、SQLServer Transact-SQL、c#和PowerBuilder代码的静态代码分析器和调用图生成器
检测分析器来显示调用图和执行统计数据
可定制的程序分析工具,具有静态的全程序全局调用图提取,适用于C, Java和COBOL
将任何图(包括调用图)的文本表示形式转换为图片。
由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] |