awk: disallow break/continue outside of loops
function old new delta .rodata 104139 104186 +47 chain_group 610 633 +23 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/0 up/down: 70/0) Total: 70 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
		@@ -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;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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 }'
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user