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