std::sort, std::binary_search, std::set, std::map и в C qsort или bsearch. Компараторы должны удовлетворять некоторым требованиям, а нарушение требований приводит к Undefined Behavior. Такие требования (или аксиомы) неинтуитивны и в них легко ошибиться, о чём свидетельствует большое количество соответствующих багов в open-source проектах.
Аксиомы, которым должны подчиняться компараторы, изложены в стандарте языка, их можно посмотреть в Cppref.
Популярные ошибки при написании компараторов:
1) Использование <= вместо <.
2) Сравнение особых объектов отдельным алгоритмом и нарушение условия транзитивности.
3) Неправильная реализация лексикографического порядка, когда не сравнивается первый элемент структуры на равенство при сравнение второго.
4) Массивы содержащие NaN.
5) Некорректная обработка специального случая.
6) Отрицание строгого порядка не является строгим порядком.
Для поиска таких проблем Юра предлагает два варианта: использование опций в тулчейне и использование динамического анализа.
В первом случае макрос -D_GLIBCXX_DEBUG в libstdc++ включает дополнительную проверку иррефлексивности, а в Libc++ c помощью -D_LIBCPP_ENABLE_DEBUG_MODE включаются проверки согласованности компараторов. Обе опции имеют существенный (2x) оверхед, поэтому их рекомендуется использовать только для тестирования.
Во втором случае динамические чекеры позволяют выполнять проверки компараторов в рантайме: SortChecker позволяет перехватывать компараторы для функций qsort и bsearch в C c помощью динамической инструментации (LD_PRELOAD), SortChecker++ позволяет проверять компараторы типа std::sort в программах на C++ и использует source-to-source инструментацию (Clang-based).