У меня есть проект 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
, установив для него общесистемное значение по умолчанию (используя update-alternative
). В этом случае cmake
генерирует файлы make, которые вызывают компилятор clang.
Я использую Ubuntu 18.10 и clang 7.
Я также пробовал это, используя clang-6
и настраивая cmake
для создания сценариев сборки ninja
вместо файлов make
, но результат всегда один и тот же.
До применения исправления весь проект отлично компилируется как с gcc
, так и с clang
.
Обратите внимание, что есть аналогичное обсуждение здесь, однако данный совет заключается в использовании run-clang-tidy.py
, что я и делаю. Поэтому не считаю это дубликатом.
Это та же проблема, о которой говорилось в обсуждении, на которое вы ссылались, и мне кажется, что это ошибка. У вас есть несколько вариантов:
Это довольно старый вопрос, но проблема все еще существует в clang 11. Проблема заключается в том, как clang сохраняет пути к файлам заголовков. Вы можете легко увидеть это в файлах yaml, например
В первом файле yaml:
Путь к файлу: 'C: / SOURCES / APP / COMMON / CORE /../../../ Libs / Sdk / Public / File.h'
Во втором файле yaml:
FilePath: 'C: / SOURCES / APP / COMMON / APPCORE / VIEWS /../../../../ Libs / Sdk / Public / File.h'
Вышеуказанные пути такие же, но не для clang apply replacements. Самый простой способ решить эту проблему - изменить скрипт run-clang-tidy.py, чтобы исправить все пути в файлах yaml перед запуском clang apply replacements.
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()
Чтобы использовать приведенный выше код, вам необходимо вызвать функцию FixYamlContent (tmpdir) непосредственно перед функцией apply_fixes. Я не разработчик Python, и приведенный выше код не полностью протестирован, но вы поняли.
Спасибо за ваш ответ. Исправление этого путем последующего редактирования файлов, вероятно, не лучший вариант, потому что, как только я включу другие проверки, мне придется выяснить, как с этим бороться. Поэтому я надеялся на то, что в первую очередь предотвратит это. Поскольку я использовал этот инструмент всего около 1 часа, я не счел целесообразным начинать подавать заявку. Я думал, что более вероятно, что я делаю что-то неправильно ...