Как стать автором
Поиск
Написать публикацию
Обновить
5
0

Пользователь

Отправить сообщение

Попробуйте в сторону jdk.astub посмотреть, описав в ней сигнатуру Objects.nonNull() с возвращаемым типом NonNull

Понимаю :-) Но вы разработчиков не заставляйте. Если вы лид, то просто закомитьте файлы инспекции в репу так, как сказано в статье. У них Idea начнет работать как вам надо: 1) инспекция начнет ругаться в Idea перед нажатием кнопки Commit, 2) начнет посвечивать NPE в редакторе, 3) автоматически подставлять спринговую Nullable аннотацию при автодополнении по Atl + Enter.

Проверил вашу схему, без дополнительной настройки Idea - отображает только проверки 2 NPE из 10 (ссылаюсь на номера проверок в таблице из статьи), так же, как и говорится в статье.

После настройки Idea так, как указано в статье, будут отображаться все 10 потенциальных NPE.

Проверил чеки плагина. Настроил по документации

Конфигурация maven
<properties>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <javac.version>9+181-r4173-1</javac.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
...
<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <showWarnings>true</showWarnings>
        <compilerArgs>
            <arg>-XDcompilePolicy=simple</arg>
            <arg>-Xplugin:ErrorProne -Xep:NullAway:ERROR -XepOpt:NullAway:AnnotatedPackages=org</arg>
        </compilerArgs>
        <annotationProcessorPaths>
            <path>
                <groupId>com.google.errorprone</groupId>
                <artifactId>error_prone_core</artifactId>
                <version>2.4.0</version>
            </path>
            <path>
                <groupId>com.uber.nullaway</groupId>
                <artifactId>nullaway</artifactId>
                <version>0.8.0</version>
            </path>
            <!-- Add any other annotation processors here,
                 even if they are also on the project dependency classpath. -->
        </annotationProcessorPaths>
    </configuration>
</plugin>

Результат NullAway: нашел 5 из 10 NPE. У Checker Framework, напомню, 10 из 10.

Проверки NullAway
// 1 проверка из таблицы в статье
[ERROR] Sub.java:[32,13] [NullAway] method returns @Nullable, but superclass method org.example.Base.nonNull(java.lang.Integer) returns 
// 8
[ERROR] Sub.java:[34,29] [NullAway] returning @Nullable expression from method with @NonNull return type
// 7
[ERROR] Sub.java:[41,63] [NullAway] assigning @Nullable expression to @NonNull field
// 4
[ERROR] Sub.java:[43,45] [NullAway] passing @Nullable parameter 'null' where @NonNull is required
// 10
[ERROR] Sub.java:[53,42] [NullAway] dereferenced expression i is @Nullable

Для полной уверенности, могли бы вы привести настройку maven в части ErrorProne + NullAway? Возможно вы действительно ничего не настраиваете и Idea отображает все проверки, и, возможно вы по-другому настраиваете maven/gradle, что NullAway находит все 10 потенциальных NPE. Было бы полезно перенять опыт, если так.

Кстати, Checker Framework - это также статический анализатор. Ваша схема очень похожа на описанную в статье.

Эта схема переносится в maven, чтобы в CI прокинуть? Проверки переносятся согласовано (одинаковый набор ошибок в Idea и CI буду отображаться)?

Проверка срабатывает тот код, который компилируется в вашем проекте. Проверяется с учетом контракта сторонней зависимости.

Т.е. анализатор (в Idea или в maven-плагине) ругнется, если в сторонней зависимости есть аннотации Nonnull / Nullable (любой реализации; в стороннем проекте одна из аннотаций может быть настроена через ее отсутствие). Если сторонняя зависимость не использует эти аннотации, провека все еще может быть настроена через механизм astub вашего проекта, либо для статических методов стороннего проекта можно сделать классы хелперы-обертки с нужными аннотациями Nonnull / Nullable.

Вы можете потестить как поведет себя анализатор на примере сторонней зависимости, который можете подключить через maven. В зависимости расставлены аннотации Nonnull / Nullable. Также можно потестить на методах JDK, его контракт поставляется в org.checkerframework:checker-qual

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность