Я работаю над большим устаревшим приложением Java 8 (Android). Недавно мы обнаружили ошибку, вызванную игнорированием результата метода. В частности, вызывающий метод send()
не предпринимал правильных действий в случае сбоя отправки. Это было исправлено, но теперь я хочу добавить некоторый статистический c анализ, чтобы помочь определить, существуют ли в нашем коде другие существующие ошибки такого же характера. И, кроме того, чтобы предотвратить добавление новых ошибок той же природы в будущем.
Мы уже используем Find Bugs, PMD, Checkstyle, Lint и SonarQube. Итак, я подумал, что у одного из них, вероятно, уже есть нужный мне чек, но его просто нужно включить. Но после нескольких часов поиска и тестирования я не думаю, что это так.
Для справки, это код, с которым я тестировал:
public class Application {
public status void main(String[] args) {
foo(); // I want this to be caught
Bar aBar = new Bar();
aBar.baz(); // I want this to be caught
}
static boolean foo() {
return System.currentTimeMillis() % 2 == 0;
}
}
public class Bar {
boolean baz() {
return System.currentTimeMillis() % 2 == 0;
}
}
Я хочу поймать это на стороне вызывающего , поскольку некоторые вызывающие абоненты могут использовать значение, а другие - нет. (Метод send()
, описанный выше, был этим случаем)
Я обнаружил следующие существующие правила анализа c, но они, похоже, применимы только к очень специфическим c обстоятельствам, чтобы избежать ложных срабатываний и не работать на мой пример:
Пока что лучшим вариантом кажется №3, но он требует мне аннотировать КАЖДЫЙ метод или класс в моем ОГРОМНОМ проекте. Java 9+, похоже, позволяет аннотировать на уровне пакета, но для меня это не вариант. Даже если бы это было так, в проекте МНОГО пакетов. Мне действительно нужен способ настроить это для применения ко всему моему проекту через одно / несколько мест, вместо того, чтобы изменять каждый файл.
Наконец, я наткнулся на этот ответ на переполнение стека , который показал Мне кажется, что IntelliJ имеет эту проверку с проверкой «Сообщать обо всех проигнорированных небиблиотечных вызовах». Кажется, что это работает, если выделить в среде IDE. Но я хочу, чтобы это привело к сбою CI. Я обнаружил, что есть способ запустить это через командную строку с помощью инструментов intelliJ , но при этом по-прежнему выводится файл XML / JSON, и мне нужно будет написать собственный код для анализа этого вывода. Мне также нужно установить инструменты IDE на машину CI, что кажется излишним.
Кто-нибудь знает лучший способ достичь того, чего я хочу? Я не могу быть первым, кто заботится только о ложных отрицаниях и не беспокоюсь о ложных срабатываниях. Я чувствую, что должно быть управляемо иметь любое возвращаемое значение, которое в настоящее время не используется, чтобы либо регистрироваться, либо явно указывалось, что возвращаемое значение намеренно игнорируется через аннотацию или присвоение переменной соглашения, как они это делают в Вероятность ошибок