Size: a a a

Compiler Development

2020 January 08

PS

Peter Sovietov in Compiler Development
Aleksey Shipilev
Ну да, stack overflow ловить -- это понятное дело. Но там уж выход за пределы стека -- это 99.999% плохая ситуация, и на перф там уже побоку. А тут можно вполне штатный (и даже написанный юзером) нуллчек свернуть.
Было бы занятно подобным образом ловить ошибки off-by-one выхода за границы массива %)
источник

PS

Peter Sovietov in Compiler Development
Или, если взять более практически полезный вариант, отследить случай добавления элемента с переполнением резерва для расширяемого массива.
источник

AS

Aleksey Shipilev in Compiler Development
Peter Sovietov
Было бы занятно подобным образом ловить ошибки off-by-one выхода за границы массива %)
Любой каприз за ваши деньги^W память! Ну и массив неплохо с обеих сторон под страницы подрезать.
источник

E

EgorBo in Compiler Development
@shipilev а у вас нуллпоинтерэкспешн нормально показывает разработчику что именно было нуллом?
например в

x = fuck().duck().suck();
источник

E

EgorBo in Compiler Development
или SIGSEGV не позволит точно показать в стектрейсе?
источник

C

Charm in Compiler Development
EgorBo
@shipilev а у вас нуллпоинтерэкспешн нормально показывает разработчику что именно было нуллом?
например в

x = fuck().duck().suck();
источник

AS

Aleksey Shipilev in Compiler Development
EgorBo
или SIGSEGV не позволит точно показать в стектрейсе?
Обработчик знает, в какой машинной инструкции случился SEGV. По этому можно узнать, в какой инструкции байткода случился null. По этому можно тривиально показать на номер строки кода из дебаг-инфы в байткоде, как делается уже давно. Или посмотреть внимательно на байткод и напечатать что-то человеческое, как это делает недавний https://openjdk.java.net/jeps/358
источник

E

EgorBo in Compiler Development
так номер строки - это понятно
источник

E

EgorBo in Compiler Development
а меня интересует какой именно объект в

x = fuck().duck().suck();
источник

E

EgorBo in Compiler Development
может дак вернул нулл, может фак
источник

E

EgorBo in Compiler Development
хотя наверное хрен так получится когда там всё нафиг поинлайнится, наоптимизируется :)
источник

AS

Aleksey Shipilev in Compiler Development
Ну да. Навернулся конкретный invoke*. JVM знает, в каком месте "абстрактной машины" мы навернулись, т.е. знает,  какой байткод-инструкции попался null.
источник

AS

Aleksey Shipilev in Compiler Development
Даже если эта байткод-инструкция в реальном сгенерированном машинном коде не существует, этот кусок состояния абстрактной машины нам известен ;)
источник

AS

Aleksey Shipilev in Compiler Development
В байткоде-то номера строк тоже из мапы (bytecode offset, line-no) берутся. Так что если VM умеет печатать номер строки, она уже на полпути к JEP 358.
источник

E

EgorBo in Compiler Development
ну у нас в целом всё так же да :)
источник

E

EgorBo in Compiler Development
мы тут еще в чате недавно обсуждали ллвм пасс с этой штукой
источник

E

EgorBo in Compiler Development
который прям в коде проверки на нуллы заменит на имплицитные
источник

E

EgorBo in Compiler Development
(но только те что юзер сам пометил атрибутом !implicit)
источник

AS

Aleksey Shipilev in Compiler Development
угу
источник

E

EgorBo in Compiler Development
так же я так понимаю хендлятся всякие переполнения и деления на ноль
источник