Exemple #1
0
    def parse_args_for_analyze_build(cls, args=None):
        # type: () -> argparse.Namespace
        """ Parse and validate command-line arguments for analyze-build. """

        parser = cls.create_analyze_parser()
        parser.add_argument(
            '--project-path',
            metavar="<path>",
            dest='cwd',
            type=str,
            default=os.getcwd(),
            help="""used path where the analyzer tools are invoked """)
        args = parser.parse_args(args=args)
        os.chdir(args.cwd)

        reconfigure_logging(args.verbose)
        logging.debug('Raw arguments %s', sys.argv)

        from_build_command = False
        arguments.normalize_args_for_analyze(args, from_build_command)
        libs = list(glob.iglob(os.path.join(CHECKER_PATH, "*.so")))
        args.plugins.extend(libs)
        args.enable_checker.extend(['ci.NetworkTaint'])
        LOGGER.error(args.enable_checker)
        arguments.validate_args_for_analyze(parser, args, from_build_command)
        logging.debug('Parsed arguments: %s', args)
        return args
Exemple #2
0
def scan():
    """ Parse and validate command line arguments. """

    from_build_command = True
    parser = analyze_parser(from_build_command)
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    analyze_validate(parser, args, from_build_command)
    logging.debug('Parsed arguments: %s', args)
    return args
Exemple #3
0
def scan():
    """ Parse and validate command line arguments. """

    from_build_command = True
    parser = analyze_parser(from_build_command)
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    analyze_validate(parser, args, from_build_command)
    logging.debug('Parsed arguments: %s', args)
    return args
Exemple #4
0
def parse_args_for_scan_build():
    """ Parse and validate command-line arguments for scan-build. """

    from_build_command = True
    parser = create_analyze_parser(from_build_command)
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    normalize_args_for_analyze(args, from_build_command)
    validate_args_for_analyze(parser, args, from_build_command)
    logging.debug('Parsed arguments: %s', args)
    return args
Exemple #5
0
def parse_args_for_scan_build():
    """ Parse and validate command-line arguments for scan-build. """

    from_build_command = True
    parser = create_analyze_parser(from_build_command)
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    normalize_args_for_analyze(args, from_build_command)
    validate_args_for_analyze(parser, args, from_build_command)
    logging.debug('Parsed arguments: %s', args)
    return args
Exemple #6
0
def intercept_build_main(bin_dir):
    """ Entry point for 'intercept-build' command. """

    parser = create_parser()
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Parsed arguments: %s', args)

    if not args.build:
        parser.print_help()
        return 0

    return capture(args, bin_dir)
Exemple #7
0
def intercept_build_main(bin_dir):
    """ Entry point for 'intercept-build' command. """

    parser = create_parser()
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    if not args.build:
        parser.print_help()
        return 0

    return capture(args, bin_dir)
Exemple #8
0
def parse_args_for_analyze_build():
    # type: () -> argparse.Namespace
    """ Parse and validate command-line arguments for analyze-build. """

    from_build_command = False
    parser = create_analyze_parser(from_build_command)
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    normalize_args_for_analyze(args, from_build_command)
    validate_args_for_analyze(parser, args, from_build_command)
    logging.debug('Parsed arguments: %s', args)
    return args
Exemple #9
0
def intercept():
    """ Parse and validate command line arguments. """

    parser = intercept_parser()
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    # short validation logic
    if not args.build:
        parser.error(message='missing build command')

    logging.debug('Parsed arguments: %s', args)
    return args
Exemple #10
0
def parse_args_for_intercept_build():
    """ Parse and validate command-line arguments for intercept-build. """

    parser = create_intercept_parser()
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    # short validation logic
    if not args.build:
        parser.error(message='missing build command')

    logging.debug('Parsed arguments: %s', args)
    return args
Exemple #11
0
def parse_args_for_analyze_build():
    # type: () -> argparse.Namespace
    """ Parse and validate command-line arguments for analyze-build. """

    from_build_command = False
    parser = create_analyze_parser(from_build_command)
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    normalize_args_for_analyze(args, from_build_command)
    validate_args_for_analyze(parser, args, from_build_command)
    logging.debug('Parsed arguments: %s', args)
    return args
Exemple #12
0
def parse_args_for_intercept_build():
    # type: () -> argparse.Namespace
    """ Parse and validate command-line arguments for intercept-build. """

    parser = create_intercept_parser()
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    # short validation logic
    if not args.build:
        parser.error(message='missing build command')

    logging.debug('Parsed arguments: %s', args)
    return args
Exemple #13
0
def analyze_build_main(bin_dir, from_build_command):
    """ Entry point for 'analyze-build' and 'scan-build'. """

    parser = create_parser(from_build_command)
    args = parser.parse_args()

    reconfigure_logging(args.verbose)
    logging.debug('Parsed arguments: %s', args)

    validate(parser, args, from_build_command)

    with report_directory(args.output, args.keep_empty) as target_dir:
        if not from_build_command:
            # run analyzer only and generate cover report
            run_analyzer(args, target_dir)
            number_of_bugs = document(args, target_dir, True)
            return number_of_bugs if args.status_bugs else 0
        elif args.intercept_first:
            # run build command and capture compiler executions
            exit_code = capture(args, bin_dir)
            # next step to run the analyzer against the captured commands
            if need_analyzer(args.build):
                run_analyzer(args, target_dir)
                # cover report generation and bug counting
                number_of_bugs = document(args, target_dir, True)
                # remove the compilation database when it was not requested
                if os.path.exists(args.cdb):
                    os.unlink(args.cdb)
                # set exit status as it was requested
                return number_of_bugs if args.status_bugs else exit_code
            else:
                return exit_code
        else:
            # run the build command with compiler wrappers which
            # execute the analyzer too. (interposition)
            environment = setup_environment(args, target_dir, bin_dir)
            logging.debug('run build in environment: %s', environment)
            exit_code = subprocess.call(args.build, env=environment)
            logging.debug('build finished with exit code: %d', exit_code)
            # cover report generation and bug counting
            number_of_bugs = document(args, target_dir, False)
            # set exit status as it was requested
            return number_of_bugs if args.status_bugs else exit_code
Exemple #14
0
def analyze_build_main(bin_dir, from_build_command):
    """ Entry point for 'analyze-build' and 'scan-build'. """

    parser = create_parser(from_build_command)
    args = parser.parse_args()
    validate(parser, args, from_build_command)

    # setup logging
    reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    with report_directory(args.output, args.keep_empty) as target_dir:
        if not from_build_command:
            # run analyzer only and generate cover report
            run_analyzer(args, target_dir)
            number_of_bugs = document(args, target_dir, True)
            return number_of_bugs if args.status_bugs else 0
        elif args.intercept_first:
            # run build command and capture compiler executions
            exit_code = capture(args, bin_dir)
            # next step to run the analyzer against the captured commands
            if need_analyzer(args.build):
                run_analyzer(args, target_dir)
                # cover report generation and bug counting
                number_of_bugs = document(args, target_dir, True)
                # remove the compilation database when it was not requested
                if os.path.exists(args.cdb):
                    os.unlink(args.cdb)
                # set exit status as it was requested
                return number_of_bugs if args.status_bugs else exit_code
            else:
                return exit_code
        else:
            # run the build command with compiler wrappers which
            # execute the analyzer too. (interposition)
            environment = setup_environment(args, target_dir, bin_dir)
            exit_code = run_build(args.build, env=environment)
            # cover report generation and bug counting
            number_of_bugs = document(args, target_dir, False)
            # set exit status as it was requested
            return number_of_bugs if args.status_bugs else exit_code
Exemple #15
0
def intercept_build(args):
    # type: () -> int
    """ Entry point for 'intercept-build' command. """

    parser = arguments.create_intercept_parser()
    parser.add_argument('--project-path',
                        metavar="<path>",
                        dest='cwd',
                        type=str,
                        default=getcwd(),
                        help="""used path where the build tools are invoked""")
    parser.add_argument('--sanitize-build',
                        action='store_true',
                        help="""Rebuild command with sanitizers enabled""")
    parser.add_argument('--fuzzing-targets',
                        action='store_true',
                        help="""Build fuzzing targets""")
    args = parser.parse_args(args)
    chdir(args.cwd)

    if args.sanitize_build:
        if not args.build:
            LOGGER.error("Please provide a build command")
            sys.exit(2)
        compiler = "{} -g {} {}"

        LOGGER.debug(
            "Compiler command %s",
            compiler.format(CLANG, CLANG_SANITIZE_CMD, CLANG_COVERAGE_CMD))
        proc = subprocess.run(
            args.build,
            shell=True,
            env={
                **env,
                **{
                    'CC':
                    compiler.format(CLANG, CLANG_SANITIZE_CMD, CLANG_COVERAGE_CMD),
                    'CXX':
                    compiler.format(CLANGPP, CLANG_SANITIZE_CMD, CLANG_COVERAGE_CMD)
                }
            })
        parser.exit(status=proc.returncode)
    if args.fuzzing_targets:
        LOGGER.info("Building fuzzing targets")
        ret = build_fuzzing_targets()
        parser.exit(status=ret)

    args.append = True

    libscanbuild.reconfigure_logging(args.verbose)
    logging.debug('Raw arguments %s', sys.argv)

    # short validation logic
    if not args.build:
        parser.error(message='missing build command')

    logging.debug('Parsed arguments: %s', args)
    exit_code, current = intercept.capture(args)

    # To support incremental builds, it is desired to read elements from
    # an existing compilation database from a previous run.
    if args.append and path.isfile(args.cdb):
        previous = compilation.CompilationDatabase.load(args.cdb)
        entries = iter(set(itertools.chain(previous, current)))
        compilation.CompilationDatabase.save(args.cdb, entries)
    else:
        compilation.CompilationDatabase.save(args.cdb, current)

    return exit_code