Вывод NotNull-аннотаций по байткоду Java
От: Ключников Илья Григорьевич http://pat.keldysh.ru/~ilya/
Дата: 31.10.14 15:08
Оценка: 380 (3)
Статья:
Вывод NotNull-аннотаций по байткоду Java
Автор(ы): Ключников Илья Григорьевич
Дата: 29.04.2014
В данной статье описывается простое решение задачи аннотирования java bytecode для более безопасного его использования (в том числе из компилятора Kotlin). Читатель может познакомится с основами методов абстрактной интерпретации и суперкомпиляции. Плата за простоту метода — экпоненциальная сложность в общем случае. Однако, простота метода облегчает его реализацию, тестирование и т.д. и может служить своеобразной точкой отсчета для создания более быстрых, но более сложных его версий.


Авторы:
Ключников Илья Григорьевич

Аннотация:
В данной статье описывается простое решение задачи аннотирования java bytecode для более безопасного его использования (в том числе из компилятора Kotlin). Читатель может познакомится с основами методов абстрактной интерпретации и суперкомпиляции. Плата за простоту метода — экпоненциальная сложность в общем случае. Однако простота метода облегчает его реализацию, тестирование и т.д., и может служить своеобразной точкой отсчета для создания более быстрых, но более сложных его версий.
Re: Вывод NotNull-аннотаций по байткоду Java
От: Blazkowicz Россия  
Дата: 03.11.14 10:07
Оценка:
Здравствуйте, Ключников Илья Григорьевич, Вы писали:

>Другой распространенной и близкой по духу ошибкой было ClassCastException, вызванное отсутствием типовых параметров – эта проблема была решена (по мнению многих, отнюдь не самым элегантным образом) в Java 1.5.

Даже во времена Java 1.4 ClassCastException небыл такой проблемой, как NPE. Помимо решения ошибки приведение генерики ещё и сильно очищают код от шума, потому что типы выносятся из использования в объявление.
Во введении ничего не сказано про Guava/Java 8 Optional.
Стоило так же раскрыть основную проблему анализа NPE, которая заключается в том что источник ошибки (null значения) и исключение находятся, зачастую, совсем не рядом в коде.
"разыменование" какой-то C++ термин для указаний. В Java он что значит?
Что слышно про аналогичные решения? http://aprove.informatik.rwth-aachen.de/eval/JBC-Nonterm/
На сколько практично применение такого инструмента в промышленых проектах?
Re[2]: Вывод NotNull-аннотаций по байткоду Java
От: lambdamix http://pat.keldysh.ru/~ilya/
Дата: 03.11.14 10:51
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>На сколько практично применение такого инструмента в промышленых проектах?


Достаточно практично. На базе описанного в статье подхода был сделан автоматический вывод аннотаций @NotNull, @Nullable, @Contract в IntelliJ IDEA 14 — http://blog.jetbrains.com/idea/2014/10/automatic-notnullnullablecontract-inference-in-intellij-idea-14/.
Re[3]: Вывод NotNull-аннотаций по байткоду Java
От: Blazkowicz Россия  
Дата: 03.11.14 10:56
Оценка:
Здравствуйте, lambdamix, Вы писали:

L>Достаточно практично. На базе описанного в статье подхода был сделан автоматический вывод аннотаций @NotNull, @Nullable, @Contract в IntelliJ IDEA 14 — http://blog.jetbrains.com/idea/2014/10/automatic-notnullnullablecontract-inference-in-intellij-idea-14/.

Спасибо. А я никак не мог вспомнить откуда у меня это устойчивое deja vu.
Re[2]: Вывод NotNull-аннотаций по байткоду Java
От: lambdamix http://pat.keldysh.ru/~ilya/
Дата: 03.11.14 12:20
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>"разыменование" какой-то C++ термин для указаний. В Java он что значит?


"Разыменование" — попытка сказать по-русски в одно слово dereference. В Java — доступ к внутреннему содержимому объекта, вызов метода на объекте, чтение и запись полей объекта (Получаем NullPointerException, если соответствующая переменная — null). На фоне терминологии C++ этот термин несколько корявый, но лучшего, по-видимому, нет. Термин dereference в таком смысле используется как раз в статьях про вывод @NotNull/@Nullable и в статьях по анализу кода на Java. Как примеры употребления:
Re[3]: Вывод NotNull-аннотаций по байткоду Java
От: Blazkowicz Россия  
Дата: 03.11.14 12:28
Оценка:
Здравствуйте, lambdamix, Вы писали:

L>"Разыменование" — попытка сказать по-русски в одно слово dereference. В Java — доступ к внутреннему содержимому объекта, вызов метода на объекте, чтение и запись полей объекта (Получаем NullPointerException, если соответствующая переменная — null). На фоне терминологии C++ этот термин несколько корявый, но лучшего, по-видимому, нет. Термин dereference в таком смысле используется как раз в статьях про вывод @NotNull/@Nullable и в статьях по анализу кода на Java. Как примеры употребления:

L> Так там тоже, похоже, наследие С++. В Java этот термин почти не используется. Его даже в JLS почти нет. Так как в чистой Java такой операции нет.
Re[2]: Вывод NotNull-аннотаций по байткоду Java
От: lambdamix http://pat.keldysh.ru/~ilya/
Дата: 03.11.14 13:16
Оценка: 9 (1)
Здравствуйте, Blazkowicz, Вы писали:

B>Что слышно про аналогичные решения? http://aprove.informatik.rwth-aachen.de/eval/JBC-Nonterm/


Есть множество инструментов для Java, которые находят ошибки в программах, связанные с использованием null. Конечная цель Kanva-micro, описанного в статье, и автоматического вывода аннотаций в IntelliJ IDEA — та же самая: находить ошибки в коде. Только в этом случае нахождение ошибок разделено на две стадии (застадировано). Вначале выводятся свойства того, как библиотеки, используемые в проекте, работают с null — эти свойства выводятся в форме аннотаций (форма здесь не так важна). А затем эти выведенные свойства используются при проверке кода, который пишет программист (когда он использует методы из библиотек). В IDEA принято, что большинство анализов (code inspections) могут показать ошибку/предупреждение почти моментально (за исключением некоторого количества глобальных анализов по всему проекту) — программист печатает код и сразу же видит ошибки. Отдельное аннотирование библиотек и использование этой информации в редакторе позволяют делать в том числе и inspection того, как программист работает с библиотечными методами на предмет NPE сразу же в редакторе. А dataflow analysis в IDEA очень мощный. Собственно говоря, вывод аннотаций сам по себе не пытается искать никаких ошибок в анализируемом коде, он собирает информацию, которая окажется полезной потом — при анализе (другого!) кода в редакторе.

Все известные мне другие инструменты (находящие NPE) не ориентированы на такой сценарий интеграции с IDE — их основной сценарий: человек нажимает кнопку, ждет (как правило, достаточно долго) и получает какие-то ошибки. Наш же подход — отдельное аннотирование библиотек + отдельный анализ исходников, в которых используются библиотеки — позволяет добиться интерактивности.

А так, да — существуют инструменты, находящие NPE — FindBugs, PMD, Julia Analyzer и т.д. Что-то они делают лучше, что-то хуже) Из тех инструментов, в которых я копался, разбираясь с их внутренним устройством, только FindBugs в некоторой степени выводит в явном виде nulllability параметров для библиотек, но делает он это очень поверхностно.
Re[3]: Вывод NotNull-аннотаций по байткоду Java
От: Blazkowicz Россия  
Дата: 03.11.14 13:29
Оценка:
Здравствуйте, lambdamix, Вы писали:

L>Все известные мне другие инструменты (находящие NPE) не ориентированы на такой сценарий интеграции с IDE — их основной сценарий: человек нажимает кнопку, ждет (как правило, достаточно долго) и получает какие-то ошибки. Наш же подход — отдельное аннотирование библиотек + отдельный анализ исходников, в которых используются библиотеки — позволяет добиться интерактивности.

Правильно ли я понял, что ваш байт-код анализатор ориентирован на 3rd party, в то время как анализатор IDE выводит nullability из исходников проекта? И тем самым они друг-друга дополняют.
Re[4]: Вывод NotNull-аннотаций по байткоду Java
От: lambdamix http://pat.keldysh.ru/~ilya/
Дата: 03.11.14 14:06
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

L>>Все известные мне другие инструменты (находящие NPE) не ориентированы на такой сценарий интеграции с IDE — их основной сценарий: человек нажимает кнопку, ждет (как правило, достаточно долго) и получает какие-то ошибки. Наш же подход — отдельное аннотирование библиотек + отдельный анализ исходников, в которых используются библиотеки — позволяет добиться интерактивности.

B>Правильно ли я понял, что ваш байт-код анализатор ориентирован на 3rd party, в то время как анализатор IDE выводит nullability из исходников проекта? И тем самым они друг-друга дополняют.

Совершенно верно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.