mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 19:52:29 +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
 |