叮叮当当在修复时插入多个"覆盖"说明符
clang-tidy inserts multiple 'override' specifiers when fixing
我有这个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
文件,但结果总是相同的。
在应用修复之前,整个项目在gcc
和clang
上都编译得很好。
请注意,这里有类似的讨论,但是那里给出的建议是使用run-clang-tidy.py
,这正是我正在做的。因此,我不认为这是重复的。
这是您链接到的讨论中提到的相同问题,在我看来它看起来像一个错误。您有以下几种选择:
- 将此报告为一个错误来叮当响。等很久。
- 自己修复错误。投入大量时间。
- 使用任何能够对多个文件/目录进行文本替换的工具(例如记事本++)。查找所有"覆盖覆盖"实例并将其替换为"覆盖"。重复上述步骤,直到不再出现。对您使用的解决方案的丑陋感到不寒而栗。:)
这是一个相当古老的问题,但问题仍然存在于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 开发人员,上面的代码没有经过全面测试,但你明白了。
- 激励'inline'说明符的真实世界示例?
- 缺少类型说明符,显式类型为"缺少错误"
- 使用ios:ate写入到流会覆盖现有文件
- 我可以重新分配/覆盖std::字符串吗
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 叮叮当当在修复时插入多个"覆盖"说明符
- 谷歌模拟和覆盖关键字
- TMap::Emplace() 在应用现有密钥时会覆盖吗?
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 编译器错误:destuctor 的更宽松的抛出说明符
- 使用子类覆盖基类中定义的函数
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 使用说明符 extern 声明的C++中的标识符链接
- 同时具有"外部"和"内联"说明符的变量
- 与 tesseract::TessBaseApi() 相关的 Tesseract-OCR 出错(预期的类型说明符)
- VS2019 C++未知覆盖说明符
- 是否可以要求虚函数使用C++"覆盖"说明符?
- 在 Visual Studio 中编译 gcc 代码会导致错误 C3646:"__attribute__":未知的覆盖说明符
- 'to_string'未知的覆盖说明符
- 未知的覆盖说明符+缺少类型说明符