Ответ 1
Есть ли какой-либо параметр или инструмент компилятора (будь то часть Visual C++, GCC, Clang или другое), которые могут анализировать мой код и сообщать мне, где я сравниваю указатели на функции друг с другом, например, в коде выше?
Я не уверен, существует ли такая опция компилятора.
Однако есть такой инструмент. лязг-аккуратно. Вы можете написать свои собственные чеки для clang-tidy, это действительно замечательно легко, если вы следуете этому блогу. В частности, AST поставляется с кучей совпадений, которые должны обрабатывать нужное место.
Кажется, что-то вроде этого работает:
binaryOperator(
anyOf(hasOperatorName("=="), hasOperatorName("!=")),
hasLHS(ignoringImpCasts(declRefExpr(hasType(functionType())))),
hasRHS(ignoringImpCasts(declRefExpr(hasType(functionType())))))
Какие флаги являются примером в OP:
fp.cxx:3:25: note: "root" binds here
int main(void) { return test1 == test2; }
^~~~~~~~~~~~~~
Это работает специально для случая OP, но вы действительно должны быть более явным, чтобы соответствовать всем другим вероятным случаям:
const auto AnyFunc = ignoringImpCasts(declRefExpr(hasType(anyOf(
functionType(),
pointsTo(functionType()),
references(functionType())))));
Finder->AddMatcher(binaryOperator(
anyOf(hasOperatorName("=="), hasOperatorName("!=")),
hasLHS(AnyFunc),
hasRHS(AnyFunc)).bind("op"), this);
Или что-то близко к этому.