← Commit list

d3480dd58

Denys Vlasenko
Denys Vlasenko
2021-07-14
SUCCESS Duration: 151s

Subject

awk: disallow break/continue outside of loops

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

editors/awk.c+4 -2
@@ -1671,16 +1671,18 @@ static void chain_group(void)
case OC_BREAK:
debug_printf_parse("%s: OC_BREAK\n", __func__);
n = chain_node(OC_EXEC);
+ if (!break_ptr)
+ syntax_error("'break' not in a loop");
n->a.n = break_ptr;
-//TODO: if break_ptr is NULL, syntax error (not in the loop)?
chain_expr(t_info);
break;
case OC_CONTINUE:
debug_printf_parse("%s: OC_CONTINUE\n", __func__);
n = chain_node(OC_EXEC);
+ if (!continue_ptr)
+ syntax_error("'continue' not in a loop");
n->a.n = continue_ptr;
-//TODO: if continue_ptr is NULL, syntax error (not in the loop)?
chain_expr(t_info);
break;
testsuite/awk.tests+2 -7
@@ -379,19 +379,14 @@ testing "awk -e and ARGC" \
""
SKIP=
-# The examples are in fact not valid awk programs (break/continue
-# can only be used inside loops).
-# But we do accept them outside of loops.
-# We had a bug with misparsing "break ; else" sequence.
-# Test that *that* bug is fixed, using simplest possible scripts:
testing "awk break" \
"awk -f - 2>&1; echo \$?" \
- "0\n" \
+ "awk: -:1: 'break' not in a loop\n1\n" \
"" \
'BEGIN { if (1) break; else a = 1 }'
testing "awk continue" \
"awk -f - 2>&1; echo \$?" \
- "0\n" \
+ "awk: -:1: 'continue' not in a loop\n1\n" \
"" \
'BEGIN { if (1) continue; else a = 1 }'