Мы загружаем файлы шрифтов с помощью opentype.js и обнаружили ошибку либо в нашем коде, либо в движке V8, либо в Chromium, которая возвращает результат DataView.getInt16() как 65536 ниже или выше, чем должен быть. Это происходит очень редко (~0,25%), но для наших пользователей это все еще сотни раз в день. В результате мы можем воспроизвести его только на паре наших компьютеров и то не всегда. Некоторые вкладки браузера будут работать всегда, а другие всегда будут давать неверное значение.
Я не специалист по бинарным операциям, но основы знаю.
Вот пример: скажем, мы ожидаем 513.
В двоичном виде мы ожидаем:
00000000000000000000001000000001 (513)
Если результат равен +65536, мы можем объяснить это перевернутым 17-м битом:
00000000000000010000001000000001 (66049 - 65536 = 513)
Если результат равен -65536, мы можем объяснить это перевернутым полным набором предыдущих 16 битов:
11111111111111110000001000000001 (-65023 + 65536 = 513)
Кажется, что иногда каким-то образом либо 17-й бит переворачивается на 1, либо весь набор битов, заполненных спереди, чтобы выполнить преобразование 16-бит в 32-бит, переворачивается на 1, включая дополнение до двух.
Мы занимаемся отладкой в течение нескольких дней и ищем помощи в том, как нам решить эту проблему. Мы хотели бы подтвердить, является ли эта проблема нашим кодом или чем-то, недавно появившимся в хроме или v8.
Здесь вы немного запутались, вы говорите о getInt16 и показываете какое-то двоичное представление 32-битного значения.
Звучит как ошибка (и как обман stackoverflow.com/questions/76706445/…), для исследования требуется репродукция.
В коде V8 getInt16 извлекает 2 8-битных (1 байт) фрагмента данных из буфера, а затем извлекает каждый из них в переменную типа int32. Следовательно, данные должны храниться в 32 битах. Я могу ошибаться, но только так я могу объяснить то, что мы видим.
@JoshRoss Конечно, в какой-то момент байты должны быть помещены либо в smi, либо в float, вот с чем будет работать JavaScript. Вопрос только в том, где/как/почему непреднамеренно добавляется лишний бит? Или, может быть, это проблема с неинициализированной переменной/памятью?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Предположение: это может быть crbug.com/1466088. Исправление уже проходит через каналы выпуска.
Если это предположение верно, то:
--js-flags = "--maglev" повышает вероятность того, что это произойдет, а запуск Chrome с --js-flags = "--no-maglev" предотвращает это.0b1xxxxxxx0xxxxxxx или 0b0xxxxxxx1xxxxxxx (где x означает «0 или 1, не имеет значения»).Можете ли вы подтвердить какое-либо из этих наблюдений?
Спасибо за продолжение и выяснить, как воспроизвести это. Запуск Chrome на наших компьютерах Mac с включенным маглевом (open -a Google\ Chrome --args --js-flags = "--maglev") делает воспроизведение очень вероятным. Я смог увидеть это в своей системе с поднятым флажком. Любые идеи относительно того, почему некоторые люди, которые не знали бы, чтобы включить маглев, включили его, а другие нет? Он случайно устанавливается при установке? Мы слышали сообщения о том, что переустановка браузера решила проблему для людей.
Чтобы уточнить, пример, который я выбрал (513), был полностью случайным и не основан на реальных числах. Я просто пытался проиллюстрировать, что может произойти.
@jnr Maglev в настоящее время проходит постепенное развертывание, чтобы избавиться от всех последних ошибок (таких как эта!), Прежде чем вскоре включить его для всех. Достаточно просто перезапустить Chrome, чтобы бросить кости, включен ли он; переустановка не требуется (и не будет иметь каких-либо постоянных последствий в этом отношении).
Я наткнулся на эту статью, в которой объясняется, что младший бит определяет, является ли элемент указателем кучи или Smi. Я не знаю, как это влияет на то, что мы видим, но, возможно, стоит отметить: medium.com/fhinkel/…