2021-02-02 09:06:04 +03:00
#!/usr/bin/env python3
2020-08-22 17:56:18 +03:00
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (C) Google LLC, 2020
#
# Author: Nathan Huckleberry <nhuck@google.com>
#
""" A helper routine run clang-tidy and the clang static-analyzer on
compile_commands . json .
"""
import argparse
import json
import multiprocessing
import os
import subprocess
import sys
def parse_arguments ( ) :
""" Set up and parses command-line arguments.
Returns :
args : Dict of parsed args
Has keys : [ path , type ]
"""
usage = """ Run clang-tidy or the clang static-analyzer on a
compilation database . """
parser = argparse . ArgumentParser ( description = usage )
type_help = " Type of analysis to be performed "
parser . add_argument ( " type " ,
choices = [ " clang-tidy " , " clang-analyzer " ] ,
help = type_help )
path_help = " Path to the compilation database to parse "
parser . add_argument ( " path " , type = str , help = path_help )
return parser . parse_args ( )
def init ( l , a ) :
global lock
global args
lock = l
args = a
def run_analysis ( entry ) :
# Disable all checks, then re-enable the ones we want
checks = " -checks=-*, "
if args . type == " clang-tidy " :
checks + = " linuxkernel-* "
else :
checks + = " clang-analyzer-* "
2022-08-04 20:46:14 +03:00
checks + = " ,-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling "
2020-08-22 17:56:18 +03:00
p = subprocess . run ( [ " clang-tidy " , " -p " , args . path , checks , entry [ " file " ] ] ,
stdout = subprocess . PIPE ,
stderr = subprocess . STDOUT ,
cwd = entry [ " directory " ] )
with lock :
sys . stderr . buffer . write ( p . stdout )
def main ( ) :
args = parse_arguments ( )
lock = multiprocessing . Lock ( )
pool = multiprocessing . Pool ( initializer = init , initargs = ( lock , args ) )
# Read JSON data into the datastore variable
with open ( args . path , " r " ) as f :
datastore = json . load ( f )
pool . map ( run_analysis , datastore )
if __name__ == " __main__ " :
main ( )