From 4be573e61dd6f7ccd951b56e90a3b3bd10842c9d Mon Sep 17 00:00:00 2001 From: "F.Tibor" Date: Wed, 23 Jul 2025 14:12:57 +0200 Subject: [PATCH 1/2] Initial caching algo (primitive) --- src/code_checker.bzl | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/src/code_checker.bzl b/src/code_checker.bzl index 2d0c81b4..57cd1cd3 100644 --- a/src/code_checker.bzl +++ b/src/code_checker.bzl @@ -16,6 +16,17 @@ LOG_FILE=$1 shift COMPILE_COMMANDS_JSON=$1 shift +IGNORE_FILE=$1 +shift +DONT_IGNORE=$1 +shift +touch $IGNORE_FILE +while [ "$1" != "CodeChecker" ]; do + if [ "$1" != "$DONT_IGNORE" ]; then + echo $1 >> $IGNORE_FILE + fi + shift +done COMPILE_COMMANDS_ABS=$COMPILE_COMMANDS_JSON.abs sed 's|"directory":"."|"directory":"'$(pwd)'"|g' $COMPILE_COMMANDS_JSON > $COMPILE_COMMANDS_ABS echo "CodeChecker command: $@" $COMPILE_COMMANDS_ABS > $LOG_FILE @@ -56,14 +67,16 @@ def _run_code_checker( clang_tidy_plist_file_name = "{}/{}_clang-tidy.plist".format(*file_name_params) clangsa_plist_file_name = "{}/{}_clangsa.plist".format(*file_name_params) codechecker_log_file_name = "{}/{}_codechecker.log".format(*file_name_params) + ignore_list_file_name = "{}/{}_ignore".format(*file_name_params) # Declare output files clang_tidy_plist = ctx.actions.declare_file(clang_tidy_plist_file_name) clangsa_plist = ctx.actions.declare_file(clangsa_plist_file_name) codechecker_log = ctx.actions.declare_file(codechecker_log_file_name) + ignore_list = ctx.actions.declare_file(ignore_list_file_name) inputs = [compile_commands_json] + sources_and_headers - outputs = [clang_tidy_plist, clangsa_plist, codechecker_log] + outputs = [clang_tidy_plist, clangsa_plist, codechecker_log, ignore_list] # Create CodeChecker wrapper script wrapper = ctx.actions.declare_file(ctx.attr.name + "/code_checker.sh") @@ -82,16 +95,30 @@ def _run_code_checker( args.add(clangsa_plist.path) args.add(codechecker_log.path) args.add(compile_commands_json.path) + args.add(ignore_list.path) + args.add(src.path) + args.add_all([inp.path for inp in inputs]) args.add("CodeChecker") args.add("analyze") args.add_all(options) args.add("--output=" + data_dir) args.add("--file=*/" + src.path) + + #unused_content = [f.path for f in inputs if f != src] + #unused_content_string = "\n".join(unused_content) + "\n" if unused_content else "" + ## Add all files, except the one testing on to the ignore list + #ctx.actions.write( + # output = ignore_list, + # content = unused_content_string, + # is_executable = True, + #) + # Action to run CodeChecker for a file ctx.actions.run( inputs = inputs, outputs = outputs, + unused_inputs_list = ignore_list, executable = wrapper, arguments = [args], mnemonic = "CodeChecker", From 22f6dfb55adf425579857c30b765217f755a455a Mon Sep 17 00:00:00 2001 From: "F.Tibor" Date: Thu, 24 Jul 2025 14:33:00 +0200 Subject: [PATCH 2/2] Add file-opening-tracking --- src/code_checker.bzl | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/code_checker.bzl b/src/code_checker.bzl index 57cd1cd3..1f86dced 100644 --- a/src/code_checker.bzl +++ b/src/code_checker.bzl @@ -16,15 +16,15 @@ LOG_FILE=$1 shift COMPILE_COMMANDS_JSON=$1 shift +STRACE="strace.tmp" IGNORE_FILE=$1 shift DONT_IGNORE=$1 shift touch $IGNORE_FILE +touch temp while [ "$1" != "CodeChecker" ]; do - if [ "$1" != "$DONT_IGNORE" ]; then - echo $1 >> $IGNORE_FILE - fi + echo $1 >> temp shift done COMPILE_COMMANDS_ABS=$COMPILE_COMMANDS_JSON.abs @@ -33,7 +33,7 @@ echo "CodeChecker command: $@" $COMPILE_COMMANDS_ABS > $LOG_FILE echo "===-----------------------------------------------------===" >> $LOG_FILE echo " CodeChecker error log " >> $LOG_FILE echo "===-----------------------------------------------------===" >> $LOG_FILE -eval "$@" $COMPILE_COMMANDS_ABS >> $LOG_FILE 2>&1 +strace -f -e trace=file -o "$STRACE" sh -c 'eval "$@" ' _ $@ "$COMPILE_COMMANDS_ABS" >> "$LOG_FILE" 2>&1 # ls -la $DATA_DIR # NOTE: the following we do to get rid of md5 hash in plist file names ret_code=$? @@ -47,6 +47,17 @@ fi cp $DATA_DIR/*_clang-tidy_*.plist $CLANG_TIDY_PLIST cp $DATA_DIR/*_clangsa_*.plist $CLANGSA_PLIST +while read -r line +do + base=$(basename "$line") + echo $base >> $LOG_FILE + if ! grep -Eq ".*(open|openat)\\(.*$base" $STRACE; then + echo $line >> $IGNORE_FILE + fi +done < temp +rm temp +rm strace.tmp + # sed -i -e "s|.*execroot/bazel_codechecker/||g" $CLANG_TIDY_PLIST # sed -i -e "s|.*execroot/bazel_codechecker/||g" $CLANGSA_PLIST