bash.im ithappens.me zadolba.li
9453

Байты вверх тормашками

Обычный компилятор gcc для какой-то ARM-платформы, обычная функция, внутрь которой передается двухбайтовое целое число. Внутрь функции попадает цена на дрова, которая ну никак не коррелирует с передаваемым снаружи числом. Молодой программист вторые сутки долбится лбом о клавиатуру и просит помочь, а я, едва взглянув, вспоминаю похожие симптомы про передачу word’а из микрософтовской библиотеки в борландовую и наоборот.

Ради шутки говорю: «Сделай так, чтоб функция принимала обычное четырёхбайтовое целое, жалко тебе, что ли?» Программер правит код — всё работает как часы. На меня смотрят большие круглые глаза — великий шаман, блин!

А дело в чём? Прараметры в стеке выравниваются на четыре байта. А разработчики компилятора просто не договорились, какие два байта из четырех считать нужными. Тот, кто писал генерацию кода для вызова функции, считал, что это два верхних байта в стеке, а тот, кто писал доступ к параметрам из тела функции — что нижние. Между микрософтовскими и борландовыми stdcall-функциями подобная шняга была, что и помогло быстро решить проблему. Плохо, когда компилятор сам с собой не дружит…