修复时clang-tidy插入多个“覆盖”说明符

时间:2018-10-28 15:04:19

标签: c++ cmake clang clang-tidy

我有这个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.

我尝试遵循here的建议,并使用cmake创建json编译命令数据库:

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

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

我正在使用Ubuntu 18.10和clang 7。

我还尝试使用cmake并设置ninja来生成make构建脚本而不是gcc文件,但是结果始终相同。

在应用此修复程序之前,整个项目都可以使用clangrun-clang-tidy.py进行编译。

请注意,这里有一个类似的讨论here,但是这里给出的建议是使用ctInvoices,这正是我在做的事情。因此,我不认为这是重复的。

2 个答案:

答案 0 :(得分:2)

这是您链接到的讨论中引用的相同问题,在我看来,这似乎是一个错误。您有几种选择:

  1. 将此作为错误报告给clang。等待很长时间。
  2. 自己修复该错误。花很多时间。
  3. 使用任何能够在多个文件/目录上进行文本替换的工具(例如Notepad ++)。查找并替换所有出现的“替代替代”。重复直到不再发生。在您使用的解决方案的丑陋中颤抖。 :)

答案 1 :(得分:1)

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

在第一个yaml文件中:
FilePath:“ C:/ SOURCES / APP / COMMON / CORE /../../../ Libs / Sdk / Public / File.h”

在secod yaml文件中:
FilePath:“ C:/ SOURCES / APP / COMMON / APPCORE / VIEWS /../../../../ Libs / Sdk / Public / File.h”

上面的路径是相同的,但是对于'clang apply replaces'来说不是。
解决此问题的最简单方法是修改脚本'run-clang-tidy.py',以在运行'clang apply replaces'之前修复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开发人员,并且上面的代码尚未经过全面测试,但是您明白了。