Перейти к содержанию
Авторизация  
SmokiMo

В системе типов Java нашли баг

Рекомендуемые сообщения

Молодой учёный Росс Тейт опубликовал текст о проблеме в системе типов Java (а также Scala), делающей эту систему «unsound».
 
Как поясняет тот же текст, слово «unsound» (буквально — «ненадёжный», «необоснованный») в данном контексте говорит, что система типов предоставляет разработчикам не все те гарантии поведения программ, которые должна была предоставить по задумке создателей. Система типов Java призвана, например, гарантировать, что метод, требующий Integer, не примет String. Тейт и Нада Амин (исследователь, участница команды Scala) обнаружили хитрый случай, в котором гарантия не соблюдается — так что компилятор, вполне соответствующий спецификации, скомпилирует код, присваивающий переменной значение другого типа (впрочем, это не означает возможности исполнять его на JVM, и вряд ли вы столкнётесь с таким кодом в рабочем проекте).
 
Впервые Амин и Тейт сообщили о своей находке в ноябре на конференции OOPSLA (update: как заметил наш читатель, в Фейсбуке сообщали и того раньше), представив там соответствующую научную публикацию. Но после конференции на это обратили внимание только в академических кругах, а вот теперь заговорили в индустрии, что и побудило Тейта написать его новый текст, предназначенный для разработчиков. Внимание многих привлёк недавний твит Джошуа Блоха с примером «ломающего систему» кода:
 
C2ux-ljVQAAFnEz.jpg
 
 
Как написал Блох в следующем твите, «Другими словами, Нада Амин и Росс Тейт обнаружили такую дыру в 12-летней системе типов в Java-дженериках, что сквозь неё можно на грузовике проехать».
 
Не все согласны с такой оценкой. Нашлось много заявлений вроде «но ведь такой код в реальной жизни никто никогда не пишет» и «но ведь он выбрасывает исключение ClassCastException».
 
Тейт в своём тексте отвечает на первое, что это не вопрос юзабилити, а вопрос безопасности — то есть мы должны думать не о том, пишем ли мы такой код сами, а о том, может ли в принципе написать такой код злонамеренный разработчик. А на второе — что с исключением нам просто повезло. Мол, так случайно получилось из-за того, что при добавлении дженериков заботились об обратной совместимости, а если бы что-то пошло иначе (например, дженерики в Java были изначально), его бы не было, что открывало бы большой простор для злоупотреблений. Так что, хотя в итоге всё обошлось без ужасных последствий, подход всё равно неправильный, и разработчикам других языков надо мотать на ус.

 

 

Помимо текста Тейта и видеоинтервью с ним и Амин, доступна страница, на которой можно лично побаловаться с примерами кода.
 
А чем же изначально была вызвана проблема? Тейт пишет, что в конечном счёте всё сводится к null-pointer bug — «но в отличие от большинства таких багов, на обнаружение этого ушло 12 лет».
 
В общем, связанные с null проблемы бывают не только у рядовых разработчиков!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...