← На главную

BattleTris портировали на Linux с Claude, найдя 20-летний баг

26.05.2026 05:57 · hackernews

Тридцатая встреча выпускников колледжа собрала людей, которых объединяла тревога за будущее. Главная тема — влияние LLM на работу и жизнь их детей. Но среди ностальгии всплыла и другая история — о старой игре.

В 1993 году автор написал BattleTris — двухпользовательский Tetris, где игроки дуэлируют по нуль-модемному кабелю. Заработанные монеты тратились на оружие, которое портило сопернику жизнь: переворачивало доску или подсовывало кривые фигуры. Игра стала хитом на курсе программной инженерии в Brown, а затем жила своей жизнью в университетских лабораториях.

В 1999 году студент Адам Левинталь организовал турнир по BattleTris. Автор не попал на него, но позже привёл Адама на стажировку в Sun Microsystems, а затем и на постоянную работу. Там они портировали BattleTris на Solaris SPARC и Solaris x86. Игра обрела новых фанатов. Одна из них — девушка автора, которая часами играла с коллегами и постоянно проигрывала автору. Пока однажды осенью 2001 года не запустила смертельную комбинацию оружия — и игра… не вылетела. Она решила, что крашнулась игра. Автор признал: она выиграла. Адам сказал: «Значит, это та самая — женись на ней». Автор сделал предложение летом 2002 года, и они женаты уже больше двадцати лет.

Прошли годы. BattleTris покрылась пылью. Автор хотел портировать её на Linux и Mac, но работа казалась безнадёжной. Всё изменилось, когда Адам взялся за дело и привлёк Claude. За удивительно короткое время Claude запустил заставку BattleTris, а затем помог портировать её на Linux.

На встрече выпускников автор показывал фото экрана с игрой, и это вызывало эмоции — не всегда позитивные. Одна пара чуть не рассталась из-за BattleTris. А когда автор и Адам наконец сыграли первую партию за двадцать лет, игра тут же упала с ошибкой «stack smashing detected». Claude нашёл баг: в функции sendBoard буфер на стеке выделялся под sizeof(int), а запись шла через макрос BTNET_PUTLONG, который на 64-битной Linux пишет sizeof(unsigned long) — 8 байт вместо 4. Для доски 280 ячеек переполнение на 1114 байт. На оригинальной 32-битной Solaris размеры совпадали, и ошибка не проявлялась.

Исправили, пересобрали — и игра пошла. Они играли всю ночь, в компании с друзьями. Автор подчёркивает: этот глубоко человечный, радостный момент подарил им тот самый инструмент, которого все боятся. Claude — мощный инструмент, но не бездушный механизм. И впереди ещё много таких «BattleTris» — моментов чистого удовольствия, ради которых мы вообще всё это строим. А саму игру — да, знаем, и готовьтесь.

Читать оригинал →