黑乌龙茶属于什么茶| 什么是妊娠| 尿液突然变深褐色是什么原因| 染色体是由什么组成的| 手抖吃什么药最好| 妒忌是什么意思| 晚上兼职可以做什么| 碳酸氢钠有什么作用| 手筋鼓起来是什么原因| 1963年属兔的是什么命| 自残是什么心理| 别致是什么意思| kitty是什么意思| 乔峰和洪七公什么关系| 女人梦到蛇预示着什么| 无冕之王是什么意思| 带银子发黑是什么原因| 8月是什么月| 银饰变黑是什么原因| 多肽是什么意思| 男占258女占369什么意思| 石榴木命是什么意思| 什么的脊背| 冰冻三尺的下一句是什么| 相濡以沫是什么意思| 大便检查能查出什么病| 国防部部长什么级别| 高血压头晕吃什么药| 一什么沙滩| 香港有什么好玩的| 肚子突然变大是什么原因| 喝什么汤下奶最快最多| 2003年属什么| 风湿因子高是什么原因引起的| 脚腕筋疼是什么原因| 什么样的生活| 鼻子大的男人说明什么| 6月25日是什么日子| 每天泡脚对身体有什么好处| 大便发黑是什么原因| 头发干燥是什么原因| 怀孕的最佳时间是什么时候| 98年的虎是什么命| 女人排卵期是什么时候| 羊膜束带是什么意思| 思伤脾是什么意思| 拉直和软化有什么区别| 现在是什么季节| 三国之前是什么朝代| 剪刀是什么生肖| 石榴叶子泡水喝有什么功效| fan什么意思| 夸父是一个什么样的人| 肝硬化早期有什么症状| 白芷是什么| 儿童流鼻血挂什么科| 保释金是什么意思| 1974年属虎的是什么命| tid什么意思| 冬瓜炒什么好吃| 什么叫ins风格| 甲沟炎是什么原因引起的| 栉风沐雨是什么意思| 嘴唇没有血色是什么原因| 幼稚细胞是什么意思| 消瘦挂什么科| 枕戈待旦什么意思| 感染艾滋病有什么症状| 穆字五行属什么| 热痱子长什么样| 能屈能伸是什么生肖| 什么是粒子植入治疗| 淋巴结肿大是什么样子| 海鸥手表是什么档次| 专科考研需要什么条件| 包皮什么年龄割最好| 九夫痣是什么意思| venes保温杯是什么品牌| 二郎腿为什么叫二郎腿| 电轴左偏是什么意思| 己未五行属什么| 白色裤子配什么上衣好看| 阳历一月份是什么星座| 猴子偷桃是什么意思| 肩胛骨疼痛挂什么科| 吃玉米有什么好处| 双鱼座的幸运石是什么| 7月25日什么星座| 凌晨一点多是什么时辰| 菠菜和豆腐为什么不能一起吃| 毫米后面的单位是什么| 什么是ntr| 午夜是什么时候| 盆腔镜检查是查什么的| 热伤风吃什么药好得快| 白羊座跟什么星座最配| 风团是什么| 井柏然原名叫什么| 坐骨神经疼有什么症状| 梦见下小雨是什么征兆| 咸鸭蛋不能和什么一起吃| 什么是混合磨玻璃结节| 玻尿酸有什么作用| 梦见买鞋子是什么意思| 什么东西可以代替阴茎| 嘴巴里长泡是什么原因| 什么味道| 高血脂是什么意思| 1月12号是什么星座| 痱子粉什么牌子好| 便血鲜红色无疼痛是什么原因| 囊性灶什么意思严重吗| 葛根粉有什么作用| 喝咖啡要注意什么| 螺子黛是什么| 大将军衔相当于什么官| 脑梗会引起什么症状| 住院送什么花好| honey什么意思| 柠檬和什么一起泡减肥| 幽门螺杆菌吃什么药最好| 男性脾大是什么原因| 心梗什么症状| 长生殿讲的是什么故事| 十月二十八是什么星座| 胃糜烂是什么症状| 空谷幽兰下一句是什么| 什么人不宜吃海参| 猪血不能和什么一起吃| 手上起倒刺是缺什么| 乳房突然疼痛什么原因| 1933年属什么生肖| 晚上九点半是什么时辰| 王晶为什么不娶邱淑贞| 肝占位是什么意思| 脚气真菌感染用什么药| 各位同仁用在什么场合| sahara是什么牌子| 维生素b6有什么作用和功效| 尿酸高什么原因引起的| 无的放矢是什么意思| 早上起床喉咙有痰是什么原因| 女孩子学什么专业| 冲锋衣三合一是什么意思| 蛇蝎心肠是什么生肖| 石千读什么| 阴性阳性什么意思| 什么是丝状疣| 花痴是什么意思| 脂肪酶是什么| 一见如什么| 什么雨| 空心是什么意思| 字号是什么意思| 儿童调理脾胃用什么药最好| 身体乳是什么| dennis什么意思| 腮腺炎是什么原因引起的| 什么叫糖化血红蛋白| 什么是甲减有什么症状| 牙齿疼是什么原因| 光感是什么意思| 古怪是什么意思| 希鲮鱼是什么鱼| 工口是什么意思| mb是什么| 新婚志喜是什么意思| 高血压能喝什么饮料| 蜂蜜不能和什么一起吃| 医保统筹是什么意思| 榴莲为什么那么臭| 父母宫代表什么| 为什么会呕吐| 玉髓是什么材质| tsh是什么意思| 生态棉是什么面料| 杭州都有什么区| 食管炎吃什么药| 两肺少许纤维灶是什么意思| 牛油果是什么味道的| 浅表性胃炎用什么药| 姓傅的男孩取什么名字| 本命年有什么说法| 排酸对身体有什么好处| 心机血缺血吃什么药最好| 气节是什么意思| 自燃是什么意思| 意大利用什么货币| 断生是什么意思啊| 什么情况下需要做喉镜检查| 暇步士属于什么档次| 胃烧灼感是什么原因| 怀孕20天有什么症状| 补体c4偏低是什么意思| 农村入党需要什么条件| 女性尿路感染什么原因引起的| 附睾炎吃什么药最有效| 暗合是什么意思| 喉咙干燥吃什么药| 长沙有什么山| 山茱萸是什么| 尿频尿急是什么原因| 住院报销需要什么材料| 嘴唇暗紫色是什么原因| 甲状腺结节吃什么散结| 遇人不淑是什么意思| 庄子姓什么| 绿豆配什么打豆浆最好| mol是什么意思| 五月二十四是什么星座| 家里有壁虎是什么征兆| 宝石蓝是什么颜色| dic是什么| 复方药是什么意思| 夜晚尿频尿多是什么原因| 5月25日什么星座| 知觉是什么意思| 小便绿色是什么原因| 念旧的人属于什么性格| 西边五行属什么| 榴莲和什么不能一起吃| 油粘米是什么米| 生不如死是什么生肖| 心电监护pr是什么意思| 腰臀比是什么意思| 花魁是什么意思| 痹是什么意思| 1.27是什么星座| 凝血五项是检查什么的| 什么是菜花状疣图片| 血小板为什么会高| 味增是什么| 战狼三什么时候上映| 身上长疮是什么原因引起的| 生物酶是什么东西| 娘子啊哈是什么歌| 腺样体增生是什么意思| 什么情况下做冠脉ct| 女右眉毛跳是什么预兆| 辣椒油用什么能洗掉| low什么意思| 天麻有什么作用与功效| 喉咙有白痰是什么原因| bgo是什么意思| shuuemura是什么牌子| CRL是胎儿的什么意思| 梦见豆腐是什么意思| 锶是什么意思| 实质性是什么意思| 蟑螂什么样子| 精神寄托是什么意思| 为什么鸡蛋不能和牛奶一起吃| 肾结石什么原因引起的| 憋是什么意思| 景五行属性是什么| 釜底抽薪是什么计| 股票pe是什么意思| 喉咙痛流鼻涕吃什么药| 经期喝茶有什么影响| 小孩血压低是什么原因| 失眠吃什么中药| 少阳病是什么意思| 什么叫飞机杯| 白斑用什么药膏| 百度

赵峰、曾玉、张建伟、汪兵探讨物联网与智能设备

(Redirected from Data flow analysis)
百度 周四沪指下跌%,而大赛高手午马三留日抓3涨停逆势收益%。

Data-flow analysis is a technique for gathering information about the possible set of values calculated at various points in a computer program. It forms the foundation for a wide variety of compiler optimizations and program verification techniques. A program's control-flow graph (CFG) is used to determine those parts of a program to which a particular value assigned to a variable might propagate. The information gathered is often used by compilers when optimizing a program. A canonical example of a data-flow analysis is reaching definitions. Other commonly used data-flow analyses include live variable analysis, available expressions, constant propagation, and very busy expressions, each serving a distinct purpose in compiler optimization passes.

A simple way to perform data-flow analysis of programs is to set up data-flow equations for each node of the control-flow graph and solve them by repeatedly calculating the output from the input locally at each node until the whole system stabilizes, i.e., it reaches a fixpoint. The efficiency and precision of this process are significantly influenced by the design of the data-flow framework, including the direction of analysis (forward or backward), the domain of values, and the join operation used to merge information from multiple control paths.This general approach, also known as Kildall's method, was developed by Gary Kildall while teaching at the Naval Postgraduate School.[1][2][3][4][5][6][7][8]

Basic principles

edit

Data-flow analysis is the process of collecting information about the way the variables are defined and used in the program. It attempts to obtain particular information at each point in a procedure. Usually, it is enough to obtain this information at the boundaries of basic blocks, since from that it is easy to compute the information at points in the basic block. In forward flow analysis, the exit state of a block is a function of the block's entry state. This function is the composition of the effects of the statements in the block. The entry state of a block is a function of the exit states of its predecessors. This yields a set of data-flow equations:

For each block b:

?
?

In this, ? is the transfer function of the block ?. It works on the entry state ?, yielding the exit state ?. The join operation ? combines the exit states of the predecessors ? of ?, yielding the entry state of ?.

After solving this set of equations, the entry and/or exit states of the blocks can be used to derive properties of the program at the block boundaries. The transfer function of each statement separately can be applied to get information at a point inside a basic block.

Each particular type of data-flow analysis has its own specific transfer function and join operation. Some data-flow problems require backward flow analysis. This follows the same plan, except that the transfer function is applied to the exit state yielding the entry state, and the join operation works on the entry states of the successors to yield the exit state.

The entry point (in forward flow) plays an important role: Since it has no predecessors, its entry state is well defined at the start of the analysis. For instance, the set of local variables with known values is empty. If the control-flow graph does not contain cycles (there were no explicit or implicit loops in the procedure) solving the equations is straightforward. The control-flow graph can then be topologically sorted; running in the order of this sort, the entry states can be computed at the start of each block, since all predecessors of that block have already been processed, so their exit states are available. If the control-flow graph does contain cycles, a more advanced algorithm is required.

An iterative algorithm

edit

The most common way of solving the data-flow equations is by using an iterative algorithm. It starts with an approximation of the in-state of each block. The out-states are then computed by applying the transfer functions on the in-states. From these, the in-states are updated by applying the join operations. The latter two steps are repeated until we reach the so-called fixpoint: the situation in which the in-states (and the out-states in consequence) do not change.

A basic algorithm for solving data-flow equations is the round-robin iterative algorithm:

for i ← 1 to N
initialize node i
while (sets are still changing)
for i ← 1 to N
recompute sets at node i

Convergence

edit

To be usable, the iterative approach should actually reach a fixpoint. This can be guaranteed by imposing constraints on the combination of the value domain of the states, the transfer functions and the join operation.

The value domain should be a partial order with finite height (i.e., there are no infinite ascending chains ? < ? < ...). The combination of the transfer function and the join operation should be monotonic with respect to this partial order. Monotonicity ensures that on each iteration the value will either stay the same or will grow larger, while finite height ensures that it cannot grow indefinitely. Thus we will ultimately reach a situation where T(x) = x for all x, which is the fixpoint.

The work list approach

edit

It is easy to improve on the algorithm above by noticing that the in-state of a block will not change if the out-states of its predecessors don't change. Therefore, we introduce a work list: a list of blocks that still need to be processed. Whenever the out-state of a block changes, we add its successors to the work list. In each iteration, a block is removed from the work list. Its out-state is computed. If the out-state changed, the block's successors are added to the work list. For efficiency, a block should not be in the work list more than once.

The algorithm is started by putting information-generating blocks in the work list. It terminates when the work list is empty.

Ordering

edit

The efficiency of iteratively solving data-flow equations is influenced by the order at which local nodes are visited.[9] Furthermore, it depends on whether the data-flow equations are used for forward or backward data-flow analysis over the CFG. Intuitively, in a forward flow problem, it would be fastest if all predecessors of a block have been processed before the block itself, since then the iteration will use the latest information. In the absence of loops it is possible to order the blocks in such a way that the correct out-states are computed by processing each block only once.

In the following, a few iteration orders for solving data-flow equations are discussed (a related concept to iteration order of a CFG is tree traversal of a tree).

  • Random order - This iteration order is not aware whether the data-flow equations solve a forward or backward data-flow problem. Therefore, the performance is relatively poor compared to specialized iteration orders.
  • Postorder - This is a typical iteration order for backward data-flow problems. In postorder iteration, a node is visited after all its successor nodes have been visited. Typically, the postorder iteration is implemented with the depth-first strategy.
  • Reverse postorder - This is a typical iteration order for forward data-flow problems. In reverse-postorder iteration, a node is visited before any of its successor nodes has been visited, except when the successor is reached by a back edge. (Note that reverse postorder is not the same as preorder.)

Initialization

edit

The initial value of the in-states is important to obtain correct and accurate results. If the results are used for compiler optimizations, they should provide conservative information, i.e. when applying the information, the program should not change semantics. The iteration of the fixpoint algorithm will take the values in the direction of the maximum element. Initializing all blocks with the maximum element is therefore not useful. At least one block starts in a state with a value less than the maximum. The details depend on the data-flow problem. If the minimum element represents totally conservative information, the results can be used safely even during the data-flow iteration. If it represents the most accurate information, fixpoint should be reached before the results can be applied.

Examples

edit

The following are examples of properties of computer programs that can be calculated by data-flow analysis. Note that the properties calculated by data-flow analysis are typically only approximations of the real properties. This is because data-flow analysis operates on the syntactical structure of the CFG without simulating the exact control flow of the program. However, to be still useful in practice, a data-flow analysis algorithm is typically designed to calculate an upper respectively lower approximation of the real program properties.

Forward analysis

edit

The reaching definition analysis calculates for each program point the set of definitions that may potentially reach this program point.

  if b == 4 then
     a = 5;
  else 
     a = 3;
  endif
 
  if a < 4 then
     ...

The reaching definition of variable a at line 7 is the set of assignments a = 5 at line 2 and a = 3 at line 4.

Backward analysis

edit

The live variable analysis calculates for each program point the variables that may be potentially read afterwards before their next write update. The result is typically used by dead code elimination to remove statements that assign to a variable whose value is not used afterwards.

The in-state of a block is the set of variables that are live at the start of it. It initially contains all variables live (contained) in the block, before the transfer function is applied and the actual contained values are computed. The transfer function of a statement is applied by killing the variables that are written within this block (remove them from the set of live variables). The out-state of a block is the set of variables that are live at the end of the block and is computed by the union of the block's successors' in-states.

Initial code:

Backward analysis:

The in-state of b3 only contains b and d, since c has been written. The out-state of b1 is the union of the in-states of b2 and b3. The definition of c in b2 can be removed, since c is not live immediately after the statement.

Solving the data-flow equations starts with initializing all in-states and out-states to the empty set. The work list is initialized by inserting the exit point (b3) in the work list (typical for backward flow). Its computed in-state differs from the previous one, so its predecessors b1 and b2 are inserted and the process continues. The progress is summarized in the table below.

processing out-state old in-state new in-state work list
b3 {} {} {b,d} (b1,b2)
b1 {b,d} {} {} (b2)
b2 {b,d} {} {a,b} (b1)
b1 {a,b,d} {} {} ()

Note that b1 was entered in the list before b2, which forced processing b1 twice (b1 was re-entered as predecessor of b2). Inserting b2 before b1 would have allowed earlier completion.

Initializing with the empty set is an optimistic initialization: all variables start out as dead. Note that the out-states cannot shrink from one iteration to the next, although the out-state can be smaller than the in-state. This can be seen from the fact that after the first iteration the out-state can only change by a change of the in-state. Since the in-state starts as the empty set, it can only grow in further iterations.

Other approaches

edit

Several modern compilers use static single-assignment form as the method for analysis of variable dependencies.[10]

In 2002, Markus Mohnen described a new method of data-flow analysis that does not require the explicit construction of a data-flow graph,[11] instead relying on abstract interpretation of the program and keeping a working set of program counters. At each conditional branch, both targets are added to the working set. Each path is followed for as many instructions as possible (until end of program or until it has looped with no changes), and then removed from the set and the next program counter retrieved.

A combination of control flow analysis and data flow analysis has shown to be useful and complementary in identifying cohesive source code regions implementing functionalities of a system (e.g., features, requirements or use cases).[12]

Special classes of problems

edit

There are a variety of special classes of dataflow problems which have efficient or general solutions.

Bit vector problems

edit

The examples above are problems in which the data-flow value is a set, e.g. the set of reaching definitions (Using a bit for a definition position in the program), or the set of live variables. These sets can be represented efficiently as bit vectors, in which each bit represents set membership of one particular element. Using this representation, the join and transfer functions can be implemented as bitwise logical operations. The join operation is typically union or intersection, implemented by bitwise logical or and logical and. The transfer function for each block can be decomposed in so-called gen and kill sets.

As an example, in live-variable analysis, the join operation is union. The kill set is the set of variables that are written in a block, whereas the gen set is the set of variables that are read without being written first. The data-flow equations become

?
?

In logical operations, this reads as

out(b) = 0
for s in succ(b)
    out(b) = out(b) or in(s)
in(b) = (out(b) and not kill(b)) or gen(b)

Dataflow problems which have sets of data-flow values which can be represented as bit vectors are called bit vector problems, gen-kill problems, or locally separable problems.[13] Such problems have generic polynomial-time solutions.[14]

In addition to the reaching definitions and live variables problems mentioned above, the following problems are instances of bitvector problems:[14]

IFDS problems

edit

Interprocedural, finite, distributive, subset problems or IFDS problems are another class of problem with a generic polynomial-time solution.[13][15] Solutions to these problems provide context-sensitive and flow-sensitive dataflow analyses.

There are several implementations of IFDS-based dataflow analyses for popular programming languages, e.g. in the Soot[16] and WALA[17] frameworks for Java analysis.

Every bitvector problem is also an IFDS problem, but there are several significant IFDS problems that are not bitvector problems, including truly-live variables and possibly-uninitialized variables.

Sensitivities

edit

Data-flow analysis is typically path-insensitive, though it is possible to define data-flow equations that yield a path-sensitive analysis.

  • A flow-sensitive analysis takes into account the order of statements in a program. For example, a flow-insensitive pointer alias analysis may determine "variables x and y may refer to the same location", while a flow-sensitive analysis may determine "after statement 20, variables x and y may refer to the same location".
  • A path-sensitive analysis computes different pieces of analysis information dependent on the predicates at conditional branch instructions. For instance, if a branch contains a condition x>0, then on the fall-through path, the analysis would assume that x<=0 and on the target of the branch it would assume that indeed x>0 holds.
  • A context-sensitive analysis is an interprocedural analysis that considers the calling context when analyzing the target of a function call. In particular, using context information one can jump back to the original call site, whereas without that information, the analysis information has to be propagated back to all possible call sites, potentially losing precision.

List of data-flow analyses

edit

See also

edit

References

edit
  1. ^ Kildall, Gary Arlen (May 1972). Global expression optimization during compilation (Ph.D. dissertation). Seattle, Washington, USA: University of Washington, Computer Science Group. Thesis No. 20506, Technical Report No. 72-06-02.
  2. ^ Kildall, Gary Arlen (2025-08-14). "A unified approach to global program optimization" (PDF). Proceedings of the 1st annual ACM SIGACT-SIGPLAN symposium on Principles of programming languages - POPL '73. pp.?194–206. doi:10.1145/512927.512945. hdl:10945/42162. S2CID?10219496. Archived (PDF) from the original on 2025-08-14. Retrieved 2025-08-14. ([1])
  3. ^ Rüthing, Oliver; Knoop, Jens; Steffen, Bernhard (2025-08-14) [1999]. "Optimization: Detecting Equalities of Variables, Combining Efficiency with Precision". In Cortesi, Agostino; Filé, Gilberto (eds.). Static Analysis: 6th International Symposium, SAS'99, Venice, Italy, September 22–24, 1999, Proceedings. Lecture Notes in Computer Science. Vol.?1694 (illustrated?ed.). Springer. pp.?232–247 [233]. ISBN?9783540664598. ISSN?0302-9743.
  4. ^ Huitt, Robert; Eubanks, Gordon; Rolander, Thomas "Tom" Alan; Laws, David; Michel, Howard E.; Halla, Brian; Wharton, John Harrison; Berg, Brian; Su, Weilian; Kildall, Scott; Kampe, Bill (2025-08-14). Laws, David (ed.). "Legacy of Gary Kildall: The CP/M IEEE Milestone Dedication" (PDF) (video transscription). Pacific Grove, California, USA: Computer History Museum. CHM Reference number: X7170.2014. Retrieved 2025-08-14. […] Eubanks: […] Gary […] was an inventor, he was inventive, he did things. His Ph.D. thesis proved that global flow analysis converges. […] This is a fundamental idea in computer science. […] I took a […] summer course once from a guy named Dhamdhere […] they talked about optimization for like a week and then they put a slide up and said, "Kildall's Method," this is the real story. […] that's something that no one ever thinks about. […] [2][3] (33 pages)
  5. ^ Kildall, Gary A. (1973). "A unified approach to global program optimization". Proceedings of the 1st annual ACM SIGACT-SIGPLAN symposium on Principles of programming languages - POPL '73. pp.?194–206. doi:10.1145/512927.512945. hdl:10945/42162.
  6. ^ Aho, Alfred V.; Lam, Monica S.; Sethi, Ravi; Ullman, Jeffrey D. (2006). Compilers: Principles, Techniques, and Tools (2nd ed.). Pearson. ISBN 978-0321486813.
  7. ^ Nielson, Flemming; Nielson, Hanne R.; Hankin, Chris (2005). Principles of Program Analysis. Springer. ISBN 978-3540654100.
  8. ^ Muchnick, Steven S. (1997). Advanced Compiler Design and Implementation. Morgan Kaufmann. ISBN 978-1558603202.
  9. ^ Cooper, Keith D.; Harvey, Timothy J.; Kennedy, Ken (2025-08-14) [November 2002]. "Iterative Data-Flow Analysis, Revisited" (PDF). PLDI 2003. ACM. TR04-432. Retrieved 2025-08-14.[permanent dead link]
  10. ^ "Static Single Assignment (with relevant examples)". GeeksforGeeks. 2025-08-14. Retrieved 2025-08-14.
  11. ^ Mohnen, Markus (2002). "A Graph—Free Approach to Data—Flow Analysis". Compiler Construction. Lecture Notes in Computer Science. Vol.?2304. pp.?185–213. doi:10.1007/3-540-45937-5_6. ISBN?978-3-540-43369-9.
  12. ^ Kuang, Hongyu; M?der, Patrick; Hu, Hao; Ghabi, Achraf; Huang, LiGuo; Lü, Jian; Egyed, Alexander (2025-08-14). "Can method data dependencies support the assessment of traceability between requirements and source code?". Journal of Software: Evolution and Process. 27 (11): 838–866. doi:10.1002/smr.1736. ISSN?2047-7481. S2CID?39846438.
  13. ^ a b Reps, Thomas; Horwitz, Susan; Sagiv, Mooly (1995). "Precise interprocedural dataflow analysis via graph reachability". Proceedings of the 22nd ACM SIGPLAN-SIGACT symposium on Principles of programming languages - POPL '95. New York, New York, USA: ACM Press. pp.?1, 49–61. doi:10.1145/199448.199462. ISBN?0-89791692-1. S2CID?5955667.
  14. ^ a b Knoop, Jens; Steffen, Bernhard; Vollmer, Jürgen (2025-08-14). "Parallelism for free: efficient and optimal bitvector analyses for parallel programs". ACM Transactions on Programming Languages and Systems. 18 (3): 268–299. doi:10.1145/229542.229545. ISSN?0164-0925. S2CID?14123780.
  15. ^ Naeem, Nomair A.; Lhoták, Ond?ej; Rodriguez, Jonathan (2010), "Practical Extensions to the IFDS Algorithm", Compiler Construction, Lecture Notes in Computer Science, vol.?6011, Berlin / Heidelberg, Germany: Springer Verlag, pp.?124–144, doi:10.1007/978-3-642-11970-5_8, ISBN?978-3-64211969-9
  16. ^ Bodden, Eric (2012). "Inter-procedural data-flow analysis with IFDS/IDE and Soot". Proceedings of the ACM SIGPLAN International Workshop on State of the Art in Java Program analysis. New York, New York, USA: ACM Press. pp.?3–8. doi:10.1145/2259051.2259052. ISBN?978-1-45031490-9. S2CID?3020481.
  17. ^ Rapoport, Marianna; Lhoták, Ond?ej; Tip, Frank (2015). Precise Data Flow Analysis in the Presence of Correlated Method Calls. International Static Analysis Symposium. Lecture Notes in Computer Science. Vol.?9291. Berlin / Heidelberg, Germany: Springer Verlag. pp.?54–71. doi:10.1007/978-3-662-48288-9_4. ISBN?978-3-66248287-2.

Further reading

edit
愿字五行属什么 糖耐量受损是什么意思 发糕是什么做的 rh是什么意思 子宫肌瘤钙化是什么意思
干性皮肤适合什么牌子的护肤品 咸肉烧什么好吃 验孕棒什么时候测最准确 高血压属于什么科 为什么会有跳蚤
3月20是什么星座 拉肚子吃什么 champion什么牌子 桃李满天下的桃李是什么意思 胃胀嗳气吃什么药最有效
香槟是什么 脚热是什么原因 孤辰是什么意思 生育保险有什么用 神经性呕吐是什么症状
有什么危害hcv8jop7ns4r.cn 18度穿什么衣服合适jinxinzhichuang.com 龙井茶属于什么茶hcv8jop8ns5r.cn 诸葛亮老婆叫什么名字hcv8jop1ns5r.cn 1993年五行属什么hcv9jop1ns9r.cn
什么叫介入治疗hcv9jop5ns1r.cn 墨菲定律什么意思hcv9jop4ns1r.cn 1974年属什么生肖dajiketang.com 胃胀气有什么症状hcv7jop5ns5r.cn 拉肚子看什么科hcv8jop9ns5r.cn
咽喉痛吃什么药xinmaowt.com 10月6日什么星座hcv8jop5ns9r.cn 梦见家里水管漏水是什么意思hcv9jop5ns8r.cn 好男儿志在四方是什么生肖hcv8jop1ns2r.cn 依托考昔片是什么药hcv8jop2ns0r.cn
经期提前是什么原因xjhesheng.com 小拇指和无名指发麻是什么原因hcv7jop9ns2r.cn 桎梏什么意思hcv8jop8ns3r.cn 天池为什么没有鱼tiangongnft.com 胃糜烂吃什么药最好hcv9jop0ns3r.cn
百度