mirror of
				https://github.com/Z3Prover/z3
				synced 2025-11-04 05:19:11 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			41 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
#!/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
 |