Example #1
0
        public void IfElseVarDefTest()
        {
            const string php = @"<?php
                                 if(true)
                                 {
	                                 $var = 1;
                                 }
                                 else
                                 {
	                                 $var = 2;
                                 }
                                 $var = 3;";

            var cfgCreator = ParseAndBuildCFG(php);
            var reachDef   = new ReachingDefinitionAnalysis();
            var analysis   = new CFGTraverser(new ForwardTraversal(), reachDef, new QueueWorklist());

            analysis.Analyze(cfgCreator.Graph);

            var inLineNumbers = new List <int>()
            {
                4, 8
            };
            var outLineNumbers = new List <int>()
            {
                4, 8, 10
            };

            foreach (var block in reachDef.ReachingSetDictionary)
            {
                if (block.Key.AstEntryNode != null && block.Key.AstEntryNode.Name == "node:Expr_Assign")
                {
                    if (block.Value.DefinedInVars.Any())
                    {
                        int ins = AstNode.GetStartLine(block.Value.DefinedInVars.Values.First().Info.Block.AstEntryNode);
                        inLineNumbers.RemoveAll(x => ins == x);
                    }
                    if (block.Value.DefinedOutVars.Any())
                    {
                        int outs = AstNode.GetStartLine(block.Value.DefinedOutVars.Values.First().Info.Block.AstEntryNode);
                        outLineNumbers.RemoveAll(x => x == outs);
                    }
                }
            }

            Assert.IsTrue(inLineNumbers.IsEmpty(), "The InLineNumbers are incorrect!");
            Assert.IsTrue(outLineNumbers.IsEmpty(), "The OutLineNumbers are incorrect!");
        }
Example #2
0
        public void IfElseVarDefTest()
        {
            const string php = @"<?php
                                 if(true)
                                 {
                                     $var = 1;
                                 }
                                 else
                                 {
                                     $var = 2;
                                 }
                                 $var = 3;";

            var cfgCreator = ParseAndBuildCFG(php);
            var reachDef = new ReachingDefinitionAnalysis();
            var analysis = new CFGTraverser(new ForwardTraversal(), reachDef, new QueueWorklist());
            analysis.Analyze(cfgCreator.Graph);

            var inLineNumbers = new List<int>() { 4, 8 };
            var outLineNumbers = new List<int>() { 4, 8, 10 };

            foreach (var block in reachDef.ReachingSetDictionary)
            {
                if (block.Key.AstEntryNode != null && block.Key.AstEntryNode.Name == "node:Expr_Assign")
                {
                    if (block.Value.DefinedInVars.Any())
                    {
                        int ins = AstNode.GetStartLine(block.Value.DefinedInVars.Values.First().Info.Block.AstEntryNode);
                        inLineNumbers.RemoveAll(x => ins == x);
                    }
                    if (block.Value.DefinedOutVars.Any())
                    {
                        int outs = AstNode.GetStartLine(block.Value.DefinedOutVars.Values.First().Info.Block.AstEntryNode);
                        outLineNumbers.RemoveAll(x => x == outs);
                    }
                }
            }

            Assert.IsTrue(inLineNumbers.IsEmpty(), "The InLineNumbers are incorrect!");
            Assert.IsTrue(outLineNumbers.IsEmpty(), "The OutLineNumbers are incorrect!");
        }