예제 #1
0
def test_exprs() -> None:
    subexpression1 = [
        BooleanRuleExpression(OPERATORS.AND_INSIDE, PatternId("pattern4"),
                              None, "p4"),
        BooleanRuleExpression(OPERATORS.AND, PatternId("pattern2"), None,
                              "p2"),
    ]
    subexpression2 = [
        BooleanRuleExpression(OPERATORS.AND_NOT_INSIDE, PatternId("pattern4"),
                              None, "p4"),
        BooleanRuleExpression(OPERATORS.AND, PatternId("pattern1"), None,
                              "p1"),
    ]
    expression = BooleanRuleExpression(
        OPERATORS.AND_ALL,
        None,
        [
            BooleanRuleExpression(OPERATORS.AND_INSIDE, PatternId("pattern3"),
                                  None, "p3"),
            BooleanRuleExpression(
                OPERATORS.AND_EITHER,
                None,
                [
                    BooleanRuleExpression(OPERATORS.AND_ALL,
                                          PatternId("someid"), subexpression1),
                    BooleanRuleExpression(OPERATORS.AND_ALL,
                                          PatternId("someid2"),
                                          subexpression2),
                ],
            ),
        ],
    )
    flat = list(enumerate_patterns_in_boolean_expression(expression))
    # print(flat)

    expected = [
        BooleanRuleExpression(OPERATORS.AND_ALL, None, None, None),
        BooleanRuleExpression(OPERATORS.AND_INSIDE, PatternId("pattern3"),
                              None, "p3"),
        BooleanRuleExpression(OPERATORS.AND_EITHER, None, None, None),
        BooleanRuleExpression(OPERATORS.AND_ALL, None, None, None),
        BooleanRuleExpression(OPERATORS.AND_INSIDE, PatternId("pattern4"),
                              None, "p4"),
        BooleanRuleExpression(OPERATORS.AND, PatternId("pattern2"), None,
                              "p2"),
        BooleanRuleExpression(OPERATORS.AND_ALL, None, None, None),
        BooleanRuleExpression(OPERATORS.AND_NOT_INSIDE, PatternId("pattern4"),
                              None, "p4"),
        BooleanRuleExpression(OPERATORS.AND, PatternId("pattern1"), None,
                              "p1"),
    ]

    assert flat == expected, f"flat: {flat}"
예제 #2
0
    def _flatten_rule_patterns(self, rules: List[Rule]) -> Iterator[Pattern]:
        """
        Convert list of rules to format understandable by semgrep core
        """
        for rule_index, rule in enumerate(rules):
            flat_expressions = list(
                enumerate_patterns_in_boolean_expression(rule.expression))
            for expr in flat_expressions:
                if not should_send_to_semgrep_core(expr):
                    continue

                span = (rule.pattern_spans.get(expr.pattern_id)
                        if expr.pattern_id is not None else None)

                for lang in rule.languages:
                    yield Pattern(rule_index, expr, rule.severity, lang, span)