root / trunk / JavaChecker / etc / checkers_coin_loops.def

1 15054 rssh
Checkers(
2 15054 rssh
[
3 15054 rssh
4 15107 rssh
 #@Show(false)
5 15054 rssh
 define(ForAroundSizeConvertable,coin,"for loop (size),convertable to foreach",
6 15054 rssh
        BT_TYPE_RULESET,
7 15054 rssh
        ruleset(
8 15054 rssh
         import(general,apply),
9 15054 rssh
10 15054 rssh
         # also PreIncrement and PostIncrement are same in ForUpdate statements
11 15054 rssh
         StatementExpression(PreIncrementExpression($x)) -> Increment($x),
12 15054 rssh
         StatementExpression($x,"++") -> Increment($x),
13 15054 rssh
14 15054 rssh
         ForInit(LocalVariableDeclaration($im,int,
15 15054 rssh
                    [VariableDeclarator(
16 15054 rssh
                       VariableDeclaratorId($index,0),
17 15054 rssh
                        IntegerLiteral(0)
18 15054 rssh
                     )]
19 15054 rssh
                 )) -> ZeroForInit($index),
20 15054 rssh
21 15054 rssh
         ForInit(StatementExpressionList([
22 15054 rssh
              StatementExpression($index,"=",IntegerLiteral(0))
23 15054 rssh
                ])) -> ZeroForInit($index),
24 15054 rssh
25 15054 rssh
26 15054 rssh
         ForStatement(
27 15054 rssh
            TraditionalForLoopHead(
28 15054 rssh
               ZeroForInit($index),
29 15054 rssh
               RelationalExpression($index,"<",
30 15054 rssh
                     MethodCall($x,Identifier("size"),Arguments([]))
31 15054 rssh
                                   ),
32 15054 rssh
               ForUpdate(StatementExpressionList(
33 15054 rssh
                [Increment($index)]
34 15054 rssh
               ))),
35 15054 rssh
            $block   )    -> CHECK(WithoutGet($x,$index,$block),
36 15054 rssh
                                   s($x,$index,$block)),
37 15054 rssh
38 15054 rssh
               WithoutGet($x,$i,$block) ->
39 15054 rssh
                let ($cleanBlock <- coin::EraseGet.EraseGet($block,$x,$i))
40 15054 rssh
                    FindSubterm.find($i,$cleanBlock),
41 15054 rssh
42 15054 rssh
               CHECK(true,$x) -> false,
43 15054 rssh
               CHECK(false,$x) -> true
44 15054 rssh
                         [ violationDiscovered(ForAroundSizeConvertable,
45 15054 rssh
                            "for loop whith size which can be converted",
46 15054 rssh
                            $x) ],
47 15054 rssh
48 15054 rssh
               CHECK($x,$y) -> p($x),
49 15054 rssh
50 15054 rssh
               p($x) -> $x [ println($x) ]
51 15054 rssh
52 15054 rssh
        ),true),
53 15054 rssh
54 15054 rssh
55 15107 rssh
 #@Show(false)
56 15054 rssh
 define(ForAroundLengthConvertable,coin,
57 15054 rssh
                           "for loop (length),convertable to foreach",
58 15054 rssh
        BT_TYPE_RULESET,
59 15054 rssh
        ruleset(
60 15054 rssh
         import(general,apply),
61 15054 rssh
62 15054 rssh
         StatementExpression(PreIncrementExpression($x)) -> Increment($x),
63 15054 rssh
         StatementExpression($x,"++") -> Increment($x),
64 15054 rssh
65 15054 rssh
         Name([$x,Identifier("length")]) -> Length($x),
66 15054 rssh
         FieldAccess([$x,Identifier("length")]) -> Length($x),
67 15054 rssh
68 15054 rssh
69 15054 rssh
         ForInit(LocalVariableDeclaration($im,int,
70 15054 rssh
                    [VariableDeclarator(
71 15054 rssh
                       VariableDeclaratorId($index,0),
72 15054 rssh
                        IntegerLiteral(0)
73 15054 rssh
                     )]
74 15054 rssh
                 )) -> ZeroForInit($index),
75 15054 rssh
76 15054 rssh
         ForInit(StatementExpressionList([
77 15054 rssh
              StatementExpression($index,"=",IntegerLiteral(0))
78 15054 rssh
                ])) -> ZeroForInit($index),
79 15054 rssh
80 15054 rssh
81 15054 rssh
         ForStatement(
82 15054 rssh
            TraditionalForLoopHead(
83 15054 rssh
               ZeroForInit($index),
84 15054 rssh
               RelationalExpression($index,"<",Length($x)),
85 15054 rssh
               ForUpdate(StatementExpressionList(
86 15054 rssh
                [Increment($index)]
87 15054 rssh
               ))),
88 15054 rssh
            $block   )    -> CHECK(WithoutIndexAccess($x,$index,$block),
89 15054 rssh
                                   s($x,$index,$block)),
90 15054 rssh
91 15054 rssh
               WithoutIndexAccess($x,$i,$block) ->
92 15054 rssh
                let ($cleanBlock <- coin::EraseIndexAccess.EraseIndexAccess($block,$x,$i))
93 15054 rssh
                    FindSubterm.find($i,$cleanBlock),
94 15054 rssh
95 15054 rssh
               CHECK(true,$x) -> false,
96 15054 rssh
               CHECK(false,$x) -> true
97 15054 rssh
                         [ violationDiscovered(ForAroundLengthConvertable,
98 15054 rssh
                            "for array loop which can be converted to foreach",
99 15054 rssh
                            $x) ],
100 15054 rssh
101 15054 rssh
               CHECK($x,$y) -> p($x),
102 15054 rssh
103 15054 rssh
               p($x) -> $x [ println($x) ]
104 15054 rssh
105 15107 rssh
        ),true),
106 15054 rssh
107 15107 rssh
   calculate(ForConvertable,coin,
108 15107 rssh
                           "traditional for loop, convertable to foreach",
109 15107 rssh
             ForAroundLengthConvertable+ForAroundSizeConvertable,
110 15107 rssh
             true)
111 15107 rssh
112 15054 rssh
113 15107 rssh
114 15054 rssh
]
115 15054 rssh
116 15054 rssh
);