Example #1
0
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
Example #2
0
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
Example #3
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)
Example #4
0
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
Example #5
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