Метод сравнения нарушает свой общий контракт! Возможен ли статический анализ?

Как и многие люди раньше, я нажал IllegalArgumentException: Comparison method violates its general contract!, мне нужно проверить устаревший код на все возможные случаи этого. Лучшим способом будет инструмент статического анализа, который проверит весь код и обнаружит возможные проблемы.


  1. Как TimSort обнаруживает эти проблемы?
  2. Можно ли запустить статический анализ кода и найти проблемы?
  3. Есть ли в наличии такой инструмент? Может быть, как правило для уже существующего инструмента статического анализа?

person MartinTeeVarga    schedule 26.06.2013    source источник


Ответы (1)


Он обнаружит их на этапе слияния, когда объединяет два прогона вместе. Обычно это просто означает, что ваша функция сравнения не следует правилам, такие вещи, как a < b и b < a, являются истинными одновременно или получают истинные значения из всех a > b, b > c и c > a.

Я не знаю ни одного инструмента статического анализа, который помог бы здесь, но я не уверен, что он вообще понадобится.

Лучше всего просто посмотреть на функцию сравнения и убедиться, что она возвращает правильное значение для различных наборов данных. На самом деле поиск функций сравнения должен быть относительно простым: нужно просто выполнить поиск Comparator во всех файлах.

person paxdiablo    schedule 26.06.2013
comment
Спасибо, я этого и боялся. На самом деле мне нужно найти все Comparator и Comparable, что, конечно, не проблема. Только то, что их 379. - person MartinTeeVarga; 26.06.2013
comment
@ sm4, вау, это ... довольно много, даже для большого приложения. Нужно задаться вопросом, действительно ли они все необходимы. - person paxdiablo; 26.06.2013
comment
Неудачное наследие. Лучше всего, вероятно, будет определить те, которые не охвачены никакими тестами, и уменьшить это число. - person MartinTeeVarga; 26.06.2013