def test_two_severity_3(self): source_file = test_support.create_tempfile(["int8 a;", "int8 b;"]) translation_unit = tu_parser.create_translation_unit(source_file) self.assertTrue(translation_unit) diags = diagnostics.get_diagnostics_by_severity(translation_unit) self.assertEqual(diags[source_file]["3"], 2)
def test_unused_variable(self): tu = tu_parser.create_translation_unit( test_support.create_tempfile( ["int main()", "{", "int a;", "return 0;", "}"])) violations = clang_warning_checker.check_for_clang_warnings(tu) self.assertEqual(len(violations), 1) self.assertEqual(violations[0].id, "TIDY_CLANG_UNUSED_VARIABLE") self.assertEqual(violations[0].message, "unused variable 'a'")
def test_get_diagnostics_by_severity_one_tu(self): source_file = test_support.create_tempfile(["int a;"]) translation_unit = tu_parser.create_translation_unit(source_file) self.assertTrue(translation_unit) diags = diagnostics.get_diagnostics_by_severity_one_tu( translation_unit) self.assertEqual(diags["2"], 1)
def test_impl_conversion(self): tu = tu_parser.create_translation_unit( test_support.create_tempfile([ "#include <cstdint>", "std::uint8_t F();", "uint8_t F()", "{", "int a=1;", "return a;", "}" ])) violations = clang_warning_checker.check_for_clang_warnings(tu) self.assertEqual(len(violations), 1) self.assertEqual(violations[0].id, "TIDY_CLANG_IMPLICIT_INT_CONVERSION") self.assertEqual( violations[0].message, "implicit conversion loses integer precision: 'int' to 'uint8_t' (aka 'unsigned char')", )
def parse_single_command(command): """Parses a command and returns a translation unit""" absolute_file_name = os.path.join(command.directory, command.filename) logging.info( colored("Parsing file '%s'", "green"), utils.make_link(absolute_file_name), ) logging.debug("Using file name (not absolute path) '%s'", utils.only_filename(command.filename)) logging.debug("Using directory '%s'", command.directory) logging.debug("Using arguments '%s'", list(command.arguments)) translation_unit = tu_parser.create_translation_unit( absolute_file_name, list(command.arguments), command.directory) return translation_unit
def main(): """Binary main entry point""" args = parse_args() logging.basicConfig(level=logging.INFO) clang_setup.setup_clang() the_file = args.file the_arguments = args.arguments # Use compdb infos if available if args.compdb: the_file, the_arguments = parse_from_compdb(args.compdb, args.file) if the_file == None: sys.exit(f"ERROR: File '{args.file}'' not found in compdb") # Only parse the file provided by the args logging.info(colored("Parsing file %s", "cyan"), the_file) logging.info(colored("Using arguments\n%s", "cyan"), pformat(the_arguments)) translation_unit = tu_parser.create_translation_unit( the_file, the_arguments) if not translation_unit: sys.exit(f"ERROR: Unable to load input for file '{the_file}'") # Dump the content if not args.diagnostics_only: tu_dump = get_info(translation_unit.cursor, args.max_depth, 0, args.details, args.references) logging.info( colored( pformat(("nodes", tu_dump), width=120), attrs=["dark"], )) # Dump the diagnostics tu_diags = [ diagnostics.get_diag_info(diagnostic) for diagnostic in translation_unit.diagnostics ] logging.info(colored(pformat(("diagnostics", tu_diags)), "yellow")) sys.exit(0)
def test_non_location_warning(self): tu = tu_parser.create_translation_unit(test_support.create_tempfile( [""]), args=["clang++"]) violations = clang_warning_checker.check_for_clang_warnings(tu) self.assertEqual(len(violations), 0)
def dump(self, source_file, args=[]): translation_unit = tu_parser.create_translation_unit(source_file, args) logging.debug( pformat(("nodes", dump.get_info(translation_unit.cursor))))
def apply_checker(self, rule, source_file, args=[]): translation_unit = tu_parser.create_translation_unit(source_file, args) self.assertTrue(translation_unit) violations = checker.apply_checker(translation_unit, rule) return violations, translation_unit.diagnostics