def test_cfa_dead_code_in_the_loops(): fdump = f'stdin.dump.json' warns, rc = check_program( """ PROGRAM dead_code_in_the_loops VAR a : INT; i : INT; END_VAR WHILE i < 10 DO IF i = 5 THEN i := i + 1; EXIT; i := 19; (* UnreachableCode error *) i := 42; (* No additional warnings *) i := 42; ELSIF i = 6 THEN CONTINUE; i := 3; (* UnreachableCode error *) i := 44; (* No additional warnings *) i := 19; END_IF; i := i + 2; END_WHILE; i := 0; END_PROGRAM """.replace('\n', '')) assert rc == 0 assert len(filter_warns(warns, 'UnreachableCode')) == 2 with DumpManager(fdump) as dm: scheme = dm.scheme assert scheme
def test_cp9(): f = 'st/plcopen-cp9.st' fdump = f'{f}.dump.json' warns, rc = run_checker(f) assert rc == 0 assert len(filter_warns(warns, 'PLCOPEN-CP9')) == 2 with DumpManager(fdump): pass
def test_unused_local_variable(): fdump = f'stdin.dump.json' warns, rc = check_program(""" PROGRAM p VAR a : INT; b : INT; c : INT; END_VAR b := 1 + c; END_PROGRAM """.replace('\n', '')) assert rc == 0 assert len(filter_warns(warns, 'UnusedVariable')) == 1 with DumpManager(fdump) as dm: scheme = dm.scheme assert scheme
def test_cfa_multiple_pous(): fdump = f'stdin.dump.json' warns, rc = check_program(""" FUNCTION dead_code_after_return_1 : INT VAR some_var : INT; END_VAR RETURN; some_var := SQRT(16#42); (* UnreachableCode error *) END_FUNCTION FUNCTION dead_code_after_return_2 : INT VAR some_var : INT; END_VAR RETURN; some_var := SQRT(16#42); (* UnreachableCode error *) END_FUNCTION """.replace('\n', '')) assert rc == 0 assert len(filter_warns(warns, 'PLCOPEN-CP2')) == 2 with DumpManager(fdump) as dm: scheme = dm.scheme assert scheme
def test_array_initialized_list(): fdump = f'stdin.dump.json' warns, rc = check_program(""" TYPE BITS: ARRAY [1..2, 1..3] OF BOOL := [0,0,0,0,0,0,1,1,1]; END_TYPE PROGRAM test_p VAR ARR1: ARRAY [1..2, 1..3] OF BOOL := [0,0,0,0,0,0,1,1,1]; END_VAR ARR1[1] := 19; END_PROGRAM """.replace('\n', '')) assert rc == 0 assert len(warns) >= 2 oob_warns = filter_warns(warns, 'OutOfBounds') assert len(oob_warns) == 2 for w in oob_warns: assert w.id == 'OutOfBounds' assert '3 values will be lost' in w.msg with DumpManager(fdump) as dm: scheme = dm.scheme assert scheme assert len(scheme.types) == 1
def test_cfa_dead_code_top_statements(): fdump = f'stdin.dump.json' warns, rc = check_program(""" FUNCTION test_dead_code_to_stmts : INT VAR counter : INT := 0; some_var : INT; END_VAR counter := counter + 1; counter := 2 + 2; RETURN; some_var := SQRT(16#42); (* UnreachableCode error *) some_var := 16#42; (* No additional warnings *) some_var := 19; END_FUNCTION """.replace('\n', '')) assert rc == 0 assert len(warns) >= 1 assert len(filter_warns(warns, 'PLCOPEN-CP2')) == 1 with DumpManager(fdump) as dm: scheme = dm.scheme assert scheme
def test_use_define_array(): fdump = f'stdin.dump.json' warns, rc = check_program(""" PROGRAM test_arr_len VAR ARR1: ARRAY [1..2] OF BOOL; END_VAR ARR1[0] := 19; (* error *) ARR1[1] := 19; (* no false positive *) ARR1[2] := 19; (* no false positive *) ARR1[3] := 19; (* error *) ARR1[2,1] := 19; (* error *) END_PROGRAM """.replace('\n', '')) assert rc == 0 assert len(warns) >= 3 ws = filter_warns(warns, 'OutOfBounds') assert len(ws) == 3 assert "index 0 is out" in ws[0].msg assert "index 3 is out" in ws[1].msg assert "addressed to 2 dimension" in ws[2].msg with DumpManager(fdump) as dm: scheme = dm.scheme assert scheme