5

我有这个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实际上是在拾取编译器。在这种情况下,生成调用 clang 编译器的 make 文件。clangupdate-alternativecmake

我正在使用 Ubuntu 18.10 和 clang 7。

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

在应用修复之前,整个项目都可以正常编译gccclang

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

4

2 回答 2

3

这与您链接到的讨论中引用的问题相同,在我看来它看起来像一个错误。你有几个选择:

  1. 将此作为 bug 报告给 clang。等待很长时间。
  2. 自己修复错误。投入大量时间。
  3. 使用任何能够对多个文件/目录进行文本替换的工具(例如 Notepad++)。查找所有“覆盖覆盖”事件并将其替换为“覆盖”。重复直到不再出现。为您使用的解决方案的丑陋而颤抖。:)
于 2018-11-05T13:36:01.560 回答
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 应用替换”。
解决此问题的最简单方法是修改脚本“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 开发人员,上面的代码没有经过全面测试,但你明白了。

于 2020-11-02T17:12:19.873 回答