[cfe-dev] How to know which edge the path is traversing?
Zhongxing Xu
mymlreader at gmail.com
Fri May 16 19:35:33 PDT 2008
Thank you!
On Sat, May 17, 2008 at 12:10 AM, Ted Kremenek <kremenek at apple.com> wrote:
>
> On May 16, 2008, at 7:32 AM, Zhongxing Xu wrote:
>
> I use GRCoreEngine to do a path sensitive analysis. For example, I can get
>> two paths for the program below:
>>
>> int f(int n) {
>> if (n > 0)
>> ...
>> else
>> ...
>> }
>>
>> I can use the nodes in EndNodes to get these two paths (by backtracking
>> from endnodes).
>> There are two BlockEdgeDst nodes after the block containing the IfStmt "if
>> (n>0)".
>> How can I know which path is led by the condition n > 0 or n <= 0? That
>> is, how can I know which is the "true"/"false" branch edge?
>>
>
> Hi Zhongxing,
>
> You will want to inspect the successors CFBBlocks of the "source" in the
> BlockEdge, and compare it against the destination. For CFGBlock's whose
> terminator is a branch (if statements, loops, etc), the first successor
> block is the true branch, the and second successor block is the false
> branch. For example:
>
>
> ProgramPoint P = N->getLocation(); // N is an ExplodedNode<...>
>
> if (BlockEdge* BE = dyn_cast<BlockEdge>(&P)) {
>
> CFGBlock* Src = BE->getSrc();
> CFGBlock* Dst = BE->getDst();
>
> // Test if we are at a (binary) branch.
> if (Src.hasBinaryBranchTerminator()) {
>
> if (*Src.succ_begin() == Dst) {
> // We took the true branch.
> }
> else {
> assert (*(Src.succ_begin()+1) == Dst);
> // We took the false branch.
> }
> }
> }
>
> Note that "hasBinaryBranchTerminator" only returns true for terminators
> that are "ForStmt", "WhileStmt", "DoStmt", "IfStmt", "ChooseExpr",
> "ConditionalOperator", and "BinaryOperator" (for '&&' and '||').
> IndirectGotoStmt and SwitchStmt work differently. IndirectGotoStmt always
> branches to a special block where the actual indirect goto takes place (do a
> CFG dump of code with a labeled goto to see what I mean). Blocks that have
> a SwitchStmt terminator have as their successor blocks the targets of the
> switch. In that case, each successor block should have "getLabel()" return
> a SwitchStmt, with the exception of the last successor. The last successor
> is always the "default" branch, which may be explicit (with a "default:"
> label) or implicit (in the case of fall-through to the code after the switch
> block).
>
> BTW, "hasBinaryBranchTerminator" was a recently added predicate method.
> Most code that inspects terminators actually uses a switch statement on the
> statement class of the terminator to handle both binary branches and other
> terminator types.
>
> Ted
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20080517/b0ed5eee/attachment.html>
More information about the cfe-dev
mailing list