z3-src 503.2.2

Source distribution of the Z3 SMT solver, for use as a build dependency
Documentation
#!/usr/bin/env python3
"""
sus.py: Search for function calls with three function-call arguments (ambiguous parameter evaluation order)
and print matches in grep-like format: file:line:match
"""
import os
import re
# skip chain calls like obj.method(...)
chain_pattern = re.compile(r"\.\s*[A-Za-z_]\w*\s*\(")

# pattern: identifier(... foo(...), ... bar(...)) with two function-call args
pattern = re.compile(
    r"\b[A-Za-z_]\w*"             # function name
    r"\s*\(\s*"                 # '('
    r"[^)]*?[A-Za-z_]\w*\([^)]*\)"  # first func-call arg anywhere
    r"[^)]*?,[^)]*?[A-Za-z_]\w*\([^)]*\)"  # second func-call arg
    r"[^)]*?\)"                   # up to closing ')'
)

# file extensions to include
excl = ('TRACE', 'ASSERT', 'VERIFY', )

for root, dirs, files in os.walk('src/smt'):
    # skip hidden dirs
    dirs[:] = [d for d in dirs if not d.startswith('.')]
    for file in files:
        path = os.path.join(root, file)
        try:
            with open(path, 'r', encoding='utf-8', errors='ignore') as f:
                for i, line in enumerate(f, 1):
                    if pattern.search(line):
                        # skip lines with TRACE or ASSERT in all caps
                        if 'TRACE' in line or 'ASSERT' in line or 'VERIFY' in line:
                            continue
                        # skip chain calls (method-style chaining)
                        if chain_pattern.search(line):
                            continue
                        full_path = os.path.abspath(path)
                        print(f"{full_path}:{i}:{line.rstrip()}")
        except OSError:
            pass