сижу я, значит, пишу обновлении для своей крипто-библиотеки (
#755847 ), и случайно вывожу на экран 2 результата от 2 запусков
PNGEncoder.
первый вариант 100% совпадает с оригиналом, а второй был слегка искажён. я сперва не сообразил, что произошло, а потом пришёл в состояние шока. решил добавить ещё парочку результатов, и получил, ещё более искажённые результаты.
flasher.ru
начал искать искать ошибки у себя в коде: переиспользование переменных; проверял везде ли чиститься память; заменял одни вызовы другим, но результат становился чаще хуже, чем лучше.
на протяжении всех 10 часов паники я общался с
wvxvw (
flasher.ru ), и мы вместе пытались понять причину, но не ничего не выходило.
в конце концов в один из блоков я вставил код проверки на записанное значение в
ByteArray. и оказалось, что там на 88731 индексе уже записано число отличное от 0.
глаза мои вылезли на орбиту: ведь этот массив был создан всего 2мя строчками выше, и в него ничего не писалось кроме одного числа в нулевой индекс! то есть фактически он был пуст.
передвинув проверку на строчку выше я удивился ещё больше, так как не только
trace оказался чист, но и картинки отобразились корректно.
немного поигравшись с перемещением срок, я убедился, в зависимости бага от положения строк.
выяснилось следующие: при определённых обстоятельствах бинарник оказывался не девственно чистым. обстоятельства такого поведения обнаружить не удалось. но решение найдено таки было.
чистота бинарника зависит от первой операции проводимой с ним!
если первой операцией будет
write, то в массиве может оказаться мусор. но если первой операцией задать ему нужную длину, то на протяжении всей длинны будут записаны только нули.
var b:ByteArray = new ByteArray();
b.writeUnsignedInt( value );
b.length = 1024; // может попасться мусор
var b:ByteArray = new ByteArray();
b.length = 1024; // мусора не будет
b.writeUnsignedInt( value );
судя по всему в бинарнике остаются значения от предыдущих вычислений, хоть я в конце каждого использования честно вызываю
clear.