Пример #1
0
 def visit_While(self, node):
     if utils.condition_is_always_false(node.test):
         self._define(self.unreachable_code,
                      'while',
                      node,
                      message="unsatisfiable 'while' condition",
                      confidence=100)
Пример #2
0
 def _handle_conditional_node(self, node, name):
     if utils.condition_is_always_false(node.test):
         self._define(
             self.unreachable_code,
             name,
             node,
             last_node=node.body[-1],
             message="unsatisfiable '{name}' condition".format(**locals()),
             confidence=100,
         )
     elif utils.condition_is_always_true(node.test):
         else_body = node.orelse
         if else_body:
             self._define(
                 self.unreachable_code,
                 "else",
                 else_body[0],
                 last_node=else_body[-1],
                 message="unreachable 'else' block",
                 confidence=100,
             )
         elif name == "if":
             # Redundant if-condition without else block.
             self._define(
                 self.unreachable_code,
                 name,
                 node,
                 message="redundant if-condition".format(**locals()),
                 confidence=100,
             )
Пример #3
0
 def visit_If(self, node):
     else_body = getattr(node, 'orelse')
     if utils.condition_is_always_true(node.test) and else_body:
         self._define(
             self.unreachable_code, 'else', else_body[0],
             last_node=else_body[-1],
             message="unreachable 'else' block",
             confidence=100)
     elif utils.condition_is_always_false(node.test):
         self._define(
             self.unreachable_code, 'if', node,
             last_node=node.body[-1],
             message="unsatisfiable 'if' condition",
             confidence=100)
Пример #4
0
 def _handle_conditional_node(self, node, name):
     if utils.condition_is_always_false(node.test):
         self._define(
             self.unreachable_code, name, node,
             last_node=node.body[-1],
             message="unsatisfiable '{name}' condition".format(**locals()),
             confidence=100)
     else:
         else_body = getattr(node, 'orelse')
         if utils.condition_is_always_true(node.test) and else_body:
             self._define(
                 self.unreachable_code, 'else', else_body[0],
                 last_node=else_body[-1],
                 message="unreachable 'else' block",
                 confidence=100)
Пример #5
0
def test_errors():
    conditions = [
        'foo',
        '__name__ == "__main__"',
        'chr(-1)',
        'getattr(True, "foo")',
        'hasattr(str, "foo")',
        'isinstance(True, True)',
        'globals()',
        'locals()',
        '().__class__',
    ]
    for condition in conditions:
        condition = ast.parse(condition, mode='eval').body
        assert not utils.condition_is_always_false(condition)
        assert not utils.condition_is_always_true(condition)
Пример #6
0
 def visit_If(self, node):
     else_body = getattr(node, 'orelse')
     if utils.condition_is_always_true(node.test) and else_body:
         self._define(self.unreachable_code,
                      'else',
                      else_body[0],
                      last_node=else_body[-1],
                      message="unreachable 'else' block",
                      confidence=100)
     elif utils.condition_is_always_false(node.test):
         self._define(self.unreachable_code,
                      'if',
                      node,
                      last_node=node.body[-1],
                      message="unsatisfiable 'if' condition",
                      confidence=100)
Пример #7
0
def test_errors():
    conditions = [
        "foo",
        '__name__ == "__main__"',
        "chr(-1)",
        'getattr(True, "foo")',
        'hasattr(str, "foo")',
        "isinstance(True, True)",
        "globals()",
        "locals()",
        "().__class__",
    ]
    for condition in conditions:
        condition = ast.parse(condition, mode="eval").body
        assert not utils.condition_is_always_false(condition)
        assert not utils.condition_is_always_true(condition)
Пример #8
0
def test_complex_conditions():
    conditions = [
        ('foo and False', True, False),
        ('foo or False', False, False),
        ('foo and True', False, False),
        ('foo or True', False, True),
        ('False and foo', True, False),
        ('False and 1', True, False),
        ('not False', False, True),
        ('not True', True, False),
        ('not foo', False, False),
        ('foo and (False or [])', True, False),
        ('(foo and bar) or {"a": 1}', False, True),
    ]
    for condition, always_false, always_true in conditions:
        condition = ast.parse(condition, mode='eval').body
        assert not (always_false and always_true)
        assert utils.condition_is_always_false(condition) == always_false
        assert utils.condition_is_always_true(condition) == always_true
Пример #9
0
def test_complex_conditions():
    conditions = [
        ("foo and False", True, False),
        ("foo or False", False, False),
        ("foo and True", False, False),
        ("foo or True", False, True),
        ("False and foo", True, False),
        ("False and 1", True, False),
        ("not False", False, True),
        ("not True", True, False),
        ("not foo", False, False),
        ("foo and (False or [])", True, False),
        ('(foo and bar) or {"a": 1}', False, True),
    ]
    for condition, always_false, always_true in conditions:
        condition = ast.parse(condition, mode="eval").body
        assert not (always_false and always_true)
        assert utils.condition_is_always_false(condition) == always_false
        assert utils.condition_is_always_true(condition) == always_true
Пример #10
0
 def _handle_conditional_node(self, node, name):
     if utils.condition_is_always_false(node.test):
         self._define(
             self.unreachable_code,
             name,
             node,
             last_node=node.body
             if isinstance(node, ast.IfExp)
             else node.body[-1],
             message=f"unsatisfiable '{name}' condition",
             confidence=100,
         )
     elif utils.condition_is_always_true(node.test):
         else_body = node.orelse
         if name == "ternary":
             self._define(
                 self.unreachable_code,
                 name,
                 else_body,
                 message="unreachable 'else' expression",
                 confidence=100,
             )
         elif else_body:
             self._define(
                 self.unreachable_code,
                 "else",
                 else_body[0],
                 last_node=else_body[-1],
                 message="unreachable 'else' block",
                 confidence=100,
             )
         elif name == "if":
             # Redundant if-condition without else block.
             self._define(
                 self.unreachable_code,
                 name,
                 node,
                 message="redundant if-condition",
                 confidence=100,
             )
Пример #11
0
def check_condition(code, result):
    condition = ast.parse(code, mode='eval').body
    if result:
        assert utils.condition_is_always_true(condition)
    else:
        assert utils.condition_is_always_false(condition)
Пример #12
0
 def visit_While(self, node):
     if utils.condition_is_always_false(node.test):
         self._define(self.unreachable_code, 'while', node,
                      message="unsatisfiable 'while' condition",
                      confidence=100)