叮叮当当在修复时插入多个"覆盖"说明符

clang-tidy inserts multiple 'override' specifiers when fixing

本文关键字:覆盖 说明符 插入 叮叮当当      更新时间:2023-10-16

我有这个cmake项目,我想使用clang-tidy进行现代化改造。为了不同时发生太多事情,我只激活了modernize-use-override选项。但是,当我应用它时:

$> run-clang-tidy  -header-filter='.*'  -checks='-*, modernize-use-override' -fix

clang-tidy插入override说明符的多个实例,例如:

void update_sizes() override override override etc.

我尝试遵循此处给出的建议,并使用cmake创建一个 json 编译命令数据库:

$>cmake ../../ -DCMAKE_BUILD_TYPE=debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

我确保cmake实际上是通过将其设置为系统范围的默认值(使用update-alternative)来获取clang编译器。在这种情况下,cmake生成调用 clang 编译器的生成文件。

我正在使用 Ubuntu 18.10 和 clang 7。

我也尝试使用clang-6和设置cmake来生成ninja构建脚本而不是make文件,但结果总是相同的。

在应用修复之前,整个项目在gccclang上都编译得很好。

请注意,这里有类似的讨论,但是那里给出的建议是使用run-clang-tidy.py,这正是我正在做的。因此,我不认为这是重复的。

这是您链接到的讨论中提到的相同问题,在我看来它看起来像一个错误。您有以下几种选择:

  1. 将此报告为一个错误来叮当响。等很久。
  2. 自己修复错误。投入大量时间。
  3. 使用任何能够对多个文件/目录进行文本替换的工具(例如记事本++)。查找所有"覆盖覆盖"实例并将其替换为"覆盖"。重复上述步骤,直到不再出现。对您使用的解决方案的丑陋感到不寒而栗。:)

这是一个相当古老的问题,但问题仍然存在于clang 11中。问题在于 clang 存储头文件路径的方式。您可以在yaml文件中轻松看到这一点,例如

在第一个 yaml 文件中:
FilePath: 'C:/SOURCES/APP/COMMON/CORE/../../../libs/sdk/public/file.h'

在 secod yaml file:
FilePath: 'C:/SOURCES/APP/COMMON/APPCORE/VIEWS/../../../../libs/sdk/public/file.h'

上面的路径是相同的,但不适用于"clang apply replacements".
解决此问题的最简单方法是修改脚本"run-clang-tidy.py"以在运行"clang apply replacements"之前修复yaml文件中的所有路径

def FixPath(line):
value = line.find("'")
if value != -1:
left = line[:value]
right = line[value+1:len(line)-2]
right = "'" + os.path.normpath(right) + "'"
line = left + right.lower() + "n"
return line
def FixYamlContent(tmpdir):
for replacefile in glob.iglob(os.path.join(tmpdir, '*.yaml')):
with open(replacefile, "r+") as file_rw:
lines = []
for line in file_rw:
if line.find("FilePath:") != -1:
line = FixPath(line)

lines.append(line)
file_rw.seek(0)
file_rw.writelines(lines)
file_rw.truncate()

要使用上面的代码,您需要在函数apply_fixes之前调用函数FixYamlContent(tmpdir)。我不是 python 开发人员,上面的代码没有经过全面测试,但你明白了。