예제 #1
0
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
예제 #2
0
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
예제 #4
0
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
예제 #6
0
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
예제 #7
0
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