Exemple #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
Exemple #2
0
 def checked_load(qualname: str) -> Optional[types.FunctionType]:
     try:
         obj = load_by_qualname(qualname)
         if isinstance(obj, types.FunctionType):
             return obj
         else:
             raise Exception('Not a function')
     except Exception as exc:
         print(f'Unable to load "{qualname}": {exc}', file=sys.stderr)
         return None
Exemple #3
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
Exemple #4
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
Exemple #5
0
 def get_member(self):
     return load_by_qualname(self.qual_name)