Javascript V8 Torque Engine неправильно загружает двоичные данные

Мы загружаем файлы шрифтов с помощью 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.

Я наткнулся на эту статью, в которой объясняется, что младший бит определяет, является ли элемент указателем кучи или Smi. Я не знаю, как это влияет на то, что мы видим, но, возможно, стоит отметить: medium.com/fhinkel/…

jnr 18.07.2023 19:43

Здесь вы немного запутались, вы говорите о getInt16 и показываете какое-то двоичное представление 32-битного значения.

Keith 18.07.2023 20:22

Звучит как ошибка (и как обман stackoverflow.com/questions/76706445/…), для исследования требуется репродукция.

jmrk 18.07.2023 21:28

В коде V8 getInt16 извлекает 2 8-битных (1 байт) фрагмента данных из буфера, а затем извлекает каждый из них в переменную типа int32. Следовательно, данные должны храниться в 32 битах. Я могу ошибаться, но только так я могу объяснить то, что мы видим.

jnr 19.07.2023 17:07

@JoshRoss Конечно, в какой-то момент байты должны быть помещены либо в smi, либо в float, вот с чем будет работать JavaScript. Вопрос только в том, где/как/почему непреднамеренно добавляется лишний бит? Или, может быть, это проблема с неинициализированной переменной/памятью?

Bergi 19.07.2023 18:12
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предположение: это может быть crbug.com/1466088. Исправление уже проходит через каналы выпуска.

Если это предположение верно, то:

  • Эта ошибка возникает только на оборудовании arm64, например. Компьютеры Mac с чипами M1/M2 и большинство устройств Android. Это никогда не происходит на процессорах Intel/AMD.
  • Эта ошибка возникает только при включенном новом оптимизирующем компиляторе "Maglev". Запуск нового экземпляра Chrome с --js-flags = "--maglev" повышает вероятность того, что это произойдет, а запуск Chrome с --js-flags = "--no-maglev" предотвращает это.
  • Эта ошибка возникает только тогда, когда старшие биты двух байтов загружаемого значения различаются. Это означает, что для 513 в вашем примере этого не произойдет; это произойдет для таких значений, как 0b1xxxxxxx0xxxxxxx или 0b0xxxxxxx1xxxxxxx (где x означает «0 или 1, не имеет значения»).

Можете ли вы подтвердить какое-либо из этих наблюдений?

Спасибо за продолжение и выяснить, как воспроизвести это. Запуск Chrome на наших компьютерах Mac с включенным маглевом (open -a Google\ Chrome --args --js-flags = "--maglev") делает воспроизведение очень вероятным. Я смог увидеть это в своей системе с поднятым флажком. Любые идеи относительно того, почему некоторые люди, которые не знали бы, чтобы включить маглев, включили его, а другие нет? Он случайно устанавливается при установке? Мы слышали сообщения о том, что переустановка браузера решила проблему для людей.

jnr 20.07.2023 17:06

Чтобы уточнить, пример, который я выбрал (513), был полностью случайным и не основан на реальных числах. Я просто пытался проиллюстрировать, что может произойти.

jnr 20.07.2023 17:09

@jnr Maglev в настоящее время проходит постепенное развертывание, чтобы избавиться от всех последних ошибок (таких как эта!), Прежде чем вскоре включить его для всех. Достаточно просто перезапустить Chrome, чтобы бросить кости, включен ли он; переустановка не требуется (и не будет иметь каких-либо постоянных последствий в этом отношении).

jmrk 20.07.2023 19:56

Другие вопросы по теме