clang-tidy扫描时误将目录识别为文件导致'Is a directory'错误的解决咨询
看起来你遇到的问题是shell通配符展开时把目录也传给了clang-tidy,导致它误把目录当成文件去读取,进而抛出错误并返回非零码。我来帮你拆解问题并给出几个可行的解决办法:
问题根源
你用的命令clang-tidy-19 --quiet -p . lib/* lib/other/* lib/logger/* ut/*里,shell的*通配符会匹配指定路径下的所有条目——包括文件和目录。比如lib/*会匹配lib/other、lib/logger这些子目录,clang-tidy收到这些目录路径后,会尝试把它们当作源文件去打开,自然就会报Is a directory的错误。
而且你尝试排除-clang-diagnostic-error没用,是因为这个错误是Clang前端的基础诊断,不属于clang-tidy的检查器范畴,没法通过.clang-tidy配置排除。
解决办法
1. 使用精确的通配符匹配文件(推荐)
如果你的shell支持globstar(Bash 4+默认开启,若没开可执行shopt -s globstar),可以用递归通配符只匹配源文件:
clang-tidy-19 --quiet -p . lib/**/*.cpp lib/**/*.h ut/**/*.cpp ut/**/*.h
**会递归匹配所有子目录,*.cpp/*.h则只选中C++源文件和头文件,完全不会包含目录路径。
2. 用find命令生成文件列表
如果你的shell不支持globstar,或者需要更灵活的文件筛选,用find命令精准找出所有要扫描的文件,再传给clang-tidy:
clang-tidy-19 --quiet -p . $(find lib ut -type f \( -name "*.cpp" -o -name "*.h" \))
-type f确保只找普通文件,排除目录-name "*.cpp" -o -name "*.h"筛选出C++源文件和头文件- 括号需要转义,保证逻辑正确
3. 从compile_commands.json提取文件列表
既然你已经有了compile_commands.json,可以直接从里面提取已编译的源文件,再补充对应的头文件(如果需要扫描头文件的话):
# 提取compile_commands里的cpp文件,再补充对应的h文件 SOURCE_FILES=$(jq -r '.[].file' compile_commands.json) HEADER_FILES=$(echo "$SOURCE_FILES" | sed 's/\.cpp/\.h/') clang-tidy-19 --quiet -p . $SOURCE_FILES $HEADER_FILES
这个方法的好处是完全和编译的文件保持一致,不会扫描未编译的文件(比如你提到的abc.cpp)。
验证方法
你可以先单独执行通配符或者find命令,看看输出的是不是只有文件路径:
# 测试通配符 echo lib/**/*.cpp lib/**/*.h # 测试find find lib ut -type f \( -name "*.cpp" -o -name "*.h" \)
确认输出里没有目录路径后,再传给clang-tidy就不会报错了。
内容来源于stack exchange

