def pool_worker_main(item: WorkItemInput, output: multiprocessing.queues.Queue) -> None: try: # TODO figure out a more reliable way to suppress this. Redirect output? # Ignore ctrl-c in workers to reduce noisy tracebacks (the parent will kill us): signal.signal(signal.SIGINT, signal.SIG_IGN) if hasattr(os, 'nice'): # analysis should run at a low priority os.nice(10) set_debug(False) filename, options, deadline = item stats: Counter[str] = Counter() options.stats = stats _, module_name = extract_module_from_file(filename) try: module = load_by_qualname(module_name) except NotFound: return except ErrorDuringImport as e: orig, frame = e.args message = AnalysisMessage(MessageType.IMPORT_ERR, str(orig), frame.filename, frame.lineno, 0, '') output.put((filename, stats, [message])) debug(f'Not analyzing "{filename}" because import failed: {e}') return messages = analyze_any(module, options) output.put((filename, stats, messages)) except BaseException as e: raise CrosshairInternal( 'Worker failed while analyzing ' + filename) from e
def check(args: argparse.Namespace, options: AnalysisOptionSet, stdout: TextIO, stderr: TextIO) -> int: any_problems = False try: entities = list(load_files_or_qualnames(args.target)) except FileNotFoundError as exc: print(f'File not found: "{exc.args[0]}"', file=stderr) return 2 except ErrorDuringImport as exc: cause = exc.__cause__ if exc.__cause__ is not None else exc print(f"Could not import your code:\n", file=stderr) traceback.print_exception(type(cause), cause, cause.__traceback__, file=stderr) return 2 full_options = DEFAULT_OPTIONS.overlay( report_verbose=False).overlay(options) for entity in entities: debug("Check ", getattr(entity, "__name__", str(entity))) for message in run_checkables(analyze_any(entity, options)): line = describe_message(message, full_options) if line is None: continue stdout.write(line + "\n") debug("Traceback for output message:\n", message.traceback) if message.state > MessageType.PRE_UNSAT: any_problems = True return 1 if any_problems else 0
def pool_worker_process_item( item: WorkItemInput ) -> Optional[Tuple[Counter[str], List[AnalysisMessage]]]: filename, options, deadline = item stats: Counter[str] = Counter() options.stats = stats try: module = load_file(filename) except NotFound as e: debug( f'Not analyzing "{filename}" because sub-module import failed: {e}' ) return None except ErrorDuringImport as e: debug(f'Not analyzing "{filename}" because import failed: {e}') return (stats, [import_error_msg(e)]) messages = analyze_any(module, options) return (stats, messages)
def check(args: argparse.Namespace, options: AnalysisOptions, stdout: TextIO) -> int: any_messages = False for name in args.files: entity: object try: entity = load_file(name) if name.endswith('.py') else load_by_qualname(name) except ErrorDuringImport as e: stdout.write(str(short_describe_message(import_error_msg(e))) + '\n') any_messages = True continue debug('Check ', getattr(entity, '__name__', str(entity))) for message in analyze_any(entity, options): line = short_describe_message(message) if line is not None: stdout.write(line + '\n') debug('Traceback for output message:\n', message.traceback) any_messages = True return 2 if any_messages else 0
def check(args: argparse.Namespace, options: AnalysisOptions) -> int: any_errors = False for name in args.files: entity: object if name.endswith('.py'): _, name = extract_module_from_file(name) try: entity = importlib.import_module(name) except Exception as e: debug(f'Not analyzing "{name}" because import failed: {e}') continue else: entity = load_by_qualname(name) debug('Check ', getattr(entity, '__name__', str(entity))) for message in analyze_any(entity, options): line = short_describe_message(message) if line is not None: print(line) debug('Traceback for output message:\n', message.traceback) any_errors = True return 1 if any_errors else 0