Control structure refinement of loops using static analysis

A system and method for discovering a set of possible iteration sequences for a given loop in a software program is described, to transform the loop representation. In a program containing a loop, the loop is partitioned into a plurality of portions based on splitting criteria. Labels are associated with the portions, and an initial loop automaton is constructed that represents the loop iterations as a regular language over the labels corresponding to the portions in the program. Subsequences of the labels are analyzed to determine infeasibility of the subsequences permitted in the automaton. The automaton is refined by removing all infeasible subsequences to discover a set of possible iteration sequences in the loop. The resulting loop automaton is used in a subsequent program verification or analysis technique to find violations of correctness properties in programs.

BACKGROUND

1. Technical Field

The present invention relates to computer program verification and more particularly to systems and methods for analyzing a loop in a program.

2. Description of the Related Art

Many static analysis and verification techniques do not perform well on loops in programs, either due to loss of precision or due to state space explosion. Many attempts have been made to address this problem. These attempts include a guided static analysis approach. This approach uses an abstract interpretation along loop paths to discover a refined control flow structure of a loop as a means of improving the precision of the final solution of the abstract interpretation itself.

A variance analysis approach uses the control flow of the loops to discover a set of ranking functions to prove termination of programs. These approaches, while providing some improvements, do not protect against state space explosion or provide the needed precision to sufficiently analyze loops.

SUMMARY

A system and method for discovering a set of possible iteration sequences for a given loop in a software program is described to transform the loop representation. In a program containing a loop, the loop is partitioned into a plurality of portions based on splitting criteria such as outcome of branches in the loop, back edges traversed by the iteration, induction variable updates, and so on. Labels are associated with the portions, and an initial loop automaton is constructed that represents the loop iterations as a regular language over the labels corresponding to the portions in the program. Subsequences of these labels that are infeasible during any program execution are determined by analyzing the program. The loop automaton is refined by removing all infeasible subsequences to discover a set of possible iteration sequences in the loop. The resulting loop automaton is used in a subsequent program verification or analysis technique to find violations of correctness properties in programs.

DETAILED DESCRIPTION OF PREFERRED EMBODIMENTS

In accordance with the present principles, a technique for analyzing control flow patterns in loops of imperative programs is provided. Such loops are common in embedded controllers that are generated automatically from a synchronous programming language. A simple yet useful technique is disclosed for refining the control structure of these loops. Such a refinement makes the structure of the loop explicit by identifying a set of possible iterative sequences in any execution. This permits a gain in precision during the subsequent application of other program analyses and verification techniques, such as abstract interpretation, model checking, etc.

The technique analyzes control flow patterns inside complex loops. The technique refines the control structure of loops using a set of labels to distinguish different control paths inside a given loop. The iterations of the loop are abstracted as a finite state automaton over these labels. We then present static analysis techniques to refine the loop by refining the language of this finite state automaton. Such refinement enables numerous applications such as a means of dovetailing static analyses for controlling the precision loss due to widening, identifying potentially non-terminating sequences and potentially improving techniques proving termination.

The set of labels are employed to distinguish between different control paths inside a given loop. The iterations of the loop are then abstracted as a finite state automaton over these labels. We use static analysis techniques to discover forbidden iteration subsequences, i.e., contiguous path segments that can never occur in any execution of the loop. Such forbidden subsequences are subtracted from the initial loop language to obtain a refinement. This refinement improves precision of other static analysis techniques that can be applied subsequently.

Embodiments described herein may be entirely hardware, entirely software or including both hardware and software elements. In a preferred embodiment, the present invention is implemented in software, which includes but is not limited to firmware, resident software, microcode, etc. The software is loaded onto computers and executed to analyze a program. The program code is stored on a computer readable medium and can be analyzed from the computer readable medium by one or more processors or by software working with one or more processors.

Referring now to the drawings in which like numerals represent the same or similar elements and initially toFIG. 1, a block/flow diagram of a system/method for analyzing loops in accordance with the present principles is illustratively shown. In block101, a loop of a program is considered. The loop is partitioned based on splitting criteria, such as outcome of branches in the loop, back edges traversed by the iteration, induction variable updates, and so on, into continuous fragments. A continuous fragment S between nodes n0and nfis a set of nodes NSand a set of edges ESsuch that all nodes in NSare reachable from n0through the edges in ESand nfis reachable from all nodes in NSthrough the edges in ES.

In block102, labels are associated with the partitions in block101. An initial loop automaton is constructed. An automaton is a mathematical model for a finite state machine (FSM). An FSM is a machine that takes a symbol as input and “jumps” or transitions, from one state to another according to a transition function (which can be expressed as a table). In the automaton, the labels correspond to code in the partitions of the loop. The set of labels are employed to distinguish between different control paths inside a given loop. The iterations of the loop are then abstracted as a finite state automaton over these labels.

In block103, a subsequence of labels that are allowed in the automaton are considered. This step acts as a check to ensure that all subsequences are considered before termination of the program. In block104, a verification engine is employed to analyze a selected subsequence. The verification engine determines whether a given subsequence is feasible or infeasible. The verification tool may include, e.g., a static analyzer, a model checker, or a constraint solver. The verification engine/tool generates proof for a verified property. Static analysis techniques are preferably employed to discover forbidden iteration subsequences, i.e., contiguous path segments that can never occur in any execution of the loop.

In block105, a determination is made as to whether proof of infeasibility exists for the selected/given subsequence. If there is no proof of infeasibility the program path returns to block103to consider the next subsequence. If there is proof of infeasibility, the program path continues to block106. In block106, invariants are derived from the proof of infeasibility. A predicate is called an invariant to a sequence of operations if the predicate always evaluates at the end of the sequence to the same value as before starting the sequence. The invariants are checked to see if other subsequences preserve the invariant. If there are other subsequences that preserve the invariant, then these subsequences can be used to expand the original subsequence. For example, suppose the subsequence s1s2is infeasible and φ is the invariant that holds at the point between s1and s2. If subsequence s3preserves the invariant q then the subsequence s1s3*s2is also infeasible. (s3* means zero or more occurrences of s3in the sequence.)

In block107, the loop automaton is updated by removing from its language all infeasible subsequences derived in block106. Forbidden subsequences (infeasible) are subtracted from the initial loop language to obtain a refinement. This refinement improves precision of other static analysis techniques that can be applied subsequently. For example, considerFIG. 3. An original control flow graph (CFG)302is shown, and a refined CFG305is shown. If we use static analysis to determine the possible value ranges for variable x at the loop head, the static analysis will compute the range (−∞,∞) for the CFG302. The same static analysis computes a more precise range [10,11] for the CFG305.

The present approach enables higher quality static analysis especially in loops, thereby improving static analysis results and obtaining efficient ways for finding proofs or violations of program properties. The present principles present an expanded control structure of the loop that enables reverse engineering of logic and exposes hazards such as potential non-termination.

In accordance with the present principles, sub-sequences are employed as targets for refinement. Rather than proving that no path may visit a given set of blocks, the present embodiments reason about a set of fragments that occur in a particular order. This way of approaching the problem is more appropriate for reasoning about loops. Further, we expect infeasible paths of the form discovered by the present technique to be more common than finding nodes that may not be visited at all. In comparison to the prior art, we provide a systematic approach that will discover a useful refinement of the loop structure on which widening may be applied to obtain better results. Widening is a technique used in abstract interpretation to ensure termination in the presence of loops. Widening ensures termination by extrapolating the results for loop heads by observing the results at the loop heads for a few iterations.

The present embodiments further provide language refinement to remove infeasible paths. As compared to other approaches for disjunctive analysis, we enable precise refinements by deriving structural information about the loop iterations. For example, in the example shown inFIG. 3, the loop structure is refined structurally to show after execution partition s1, the loop must exit or partition s2must be executed.

Referring toFIG. 2, a block/flow diagram of a system/method for analyzing loops in accordance with the present principles is illustratively shown. In block200, preprocessing and loop partitioning are performed on a program having a loop. In block201, subsequences are selected as a refinement target. In block202, a subsequence analyzer (or verification engine) is employed to analyze the subsequences to determine invariants in the subsequence. In block203, language refinement is performed to remove invariants. At this point, other analyses may be employed to check/verify the program in block205. Such analyses may include a static analyses, verification, etc. In accordance with the present principles, the present embodiments may be employed to check a program for non-termination, improve precision of static analysis, check typestates, etc.

FIG. 3shows an example that illustrates the system/method to determine the set of possible iteration sequences for loops in the program. An example program301includes a loop. The loop is such that the value of a variable on exiting the loop is either10or11. The control flow graph (CFG)302is shown along with loop partitions and the partition labels s1, s2and e. A finite state automaton303represents the iterations of the loop using the partition labels. The double circles inFIG. 3represent an accepting state. A refined automaton304is obtained after removing infeasible subsequences s1* and s2*. A CFG305is obtained by refining the loop using the refined automaton304. The example depicted is for illustrative purposes and should not be construed as limiting the present invention.

Referring toFIG. 4, a system400includes a processor402and memory404for program verification. A program406having a loop is input into the system400(see e.g.,FIG. 3). The processor402and memory404are configured to execute the methods in accordance with the present principles. The memory404stores a verification engine408, which is executed to provide static analysis. The program406is analyzed/verified. If warning are issued the system and/or a user may make corrections or adjustments to the program406accordingly through user interfaces (not shown).