KernelNewbies:

First store all occurrences of loops in a file. gg -A40 "(while|for)" -- '*.c' '*.h' > ../out/loop_A40

Error: the same index is used in a nested loop

gres --FiL="../out/loop_A40" \
"(while \(|for \([^;]*;) @...&@ [+-]* (@w) ([+-][+-] [<>]|[<>]=) ((@K|@d|@K \(...\))) @&...@ (;\(-..\))?\)
 @in_branches
 (while \(|for \([^;]*;) @...&@ [+-]* \6 ([+-][+-] [<>]|[<>]=) ((@K|@d|@K \(...\))) @&...@ (;\(-..\))?\)" | less

Error: the same index is used in the header of a nested for loop

gres --FiL="../out/loop_A40" \
"(while \(|for \([^;]*;) @...&@ [+-]* (@w) ([+-][+-] [<>]|[<>]=) ((@K|@d|@K \(...\))) @&...@ (;\(-..\))?\)
 @in_branches \n
 for \(\(-8.\)@Q2\6@Q1\(-8.\)\)" | less

The test after the loop is off by 1 (extended example of gres_examples):

gres --FiL="../out/loop_A40" \
"while \( @...&|@ (@V) (<|\!=) (@d|@w) @&|...@ \) (\{\{-..\} \n)? \5 ([+*|]=|= \5 \+)@n
if \( @...&|@ \5 (>|<=) \7 @&|...@ \)" \
"(for \([^;]*;|while \() @...&|@
         \+* (@V) (<|\!=|\+\+ <=) (@d|@w) @&|...@
         (; (\+\+ \6|\6 \+\+|\6 = \6 \+ 1|\6 = 1 \+ \6))? \)
    \{.8.\}
@n
if \( @...&|@ \6 (>|<=) \8 @&|...@ \)"

Similarly off by one after decrementing in a loop:

gres --FiL="../out/loop_A40" \
"while \( @...&|@ (@V) (>|\!=) (@d|@w) @&|...@ \) (\{\{-..\} \n)? \5 (-=|= \5 -)@n
if \( @...&|@ \5 (<|>=) \7 @&|...@ \)" \
"(for \([^;]*;|while \() @...&|@
         -* (@V) (>|\!=) (@d|@w) @&|...@
         (; (-- \6|\6 --|\6 = \6 - 1|\6 = 1 - \6))? \)
    \{.8.\}
@n
if \( @...&|@ \6 (<|>=) \8 @&|...@ \)"

Using a variable after the loop, can be out of bounds after max or before min.

gres --FiL="../out/loop_A40" \
"(while \(|for \([^;]*;) @...&@ [+-]* (@w) ([+-][+-] [<>]|[+-][+-] [\!]=|[<>]=)? ((@K|@d|@K \(...\)))? @&...@ (;\(-..\))?\)
   @branch@n
 (for \()? \6 .?=@n
 [^\n]*\[ \6 \]" \
"(while \(|for \([^;]*;) @...&@ [+-]* (@w) ([+-][+-] [<>]|[+-][+-] [\!]=|[<>]=)? ((@K|@d|@K \(...\)))? @&...@ (;\(-..\))?\)
   @branch@n
 [^\n]*\[ \6 \]" | less

break in loop, but the variable after loop, can be out of bounds after max or before min.

gres --FiL="../out/loop_A40" \
"if \(@...&@ [+-]* (@w) ([+-][+-] [<>]|[+-][+-] [\!]=|[<>]=)? ((@K|@d|@K \(...\)))? @&...@ (;\(-..\))?\)
  (break ;|\{-8.\}\n break; \})
 \{-8.\}\}@n
 (for \()? \5 .?=@n
[^\n]*\[ \5 \]" \
"if \(@...&@ [+-]* (@w) ([+-][+-] [<>]|[+-][+-] [\!]=|[<>]=)? ((@K|@d|@K \(...\)))? @&...@ (;\(-..\))?\)
  (break ;|\{-8.\}\n break; \})
 \{-8.\}\}@n
[^\n]*\[ \5 \]" | less

KernelNewbies: roelkluin/gres_tests/loops (last edited 2017-12-30 01:30:06 by localhost)