group-telegram.com/cxx95/52
Create:
Last Update:
Last Update:
#compiler
[Часть 2/2]
Как работает статический анализ кода? Обзор clang-tidy 🧹🧹🧹
В коде, который реагирует на найденную ноду, нужно определить текст warning-a:
const VarDecl *D = nullptr;Если мы увидели, что переменная объявлена не в хидере, то ничего не делаем, возвращаем из функции (на уровне AST Matchers это пока нельзя ловить).
StringRef Msg;
bool InsertInlineKeyword = false;
if ((D = Result.Nodes.getNodeAs<VarDecl>("non-inline-var-definition"))) {
Msg = "global constant %0 should be marked as 'inline'";
InsertInlineKeyword = true;
} else {
D = Result.Nodes.getNodeAs<VarDecl>("extern-var-declaration");
Msg = "global constant %0 should be converted to C++17 'inline variable'";
}
Теперь можно вывести красивый warning в месте объявления переменной.
Если у нас случай с определением не-inline переменной, то заодно можно поправить исходник, приписав
"inline "
перед объявлением переменной (во время работы clang-tidy поправит исходник):DiagnosticBuilder Diag = diag(D->getLocation(), Msg) << D;Теперь вы знаете, как примерно работает статический анализ кода 🙂
if (InsertInlineKeyword)
Diag << FixItHint::CreateInsertion(D->getBeginLoc(), "inline ");
BY C++95
Warning: Undefined variable $i in /var/www/group-telegram/post.php on line 260
Share with your friend now:
group-telegram.com/cxx95/52