You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

clang-tidy扫描时误将目录识别为文件导致'Is a directory'错误的解决咨询

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:54:27