December 22nd, 2020

дефолт

Баг-красавец, но не мой

На работе новый комп на основе AMD Ryzen 9 3950X. Поставили туда Debian, все дела, стал настраивать по-тихоньку для себя и дошел до момента, когда потребовалось поставить KeepassXC. А поскольку в других местах у меня он везде последней версии 2.6.2, а в Debian buster он только версии 2.5.4, то для исключения проблем совместимости, решил собрать бэкпорт.

А при построении пакета там обязательным шагом собираются и прогоняются юнит-тесты. И вот они-то и не проходят. "Что за ерунда?" - думаю я. Стал разбираться. Проблемы возникают в тесте, который оперирует стандартной Qt'шной hash-таблицей QHash - случается что при добавлении двух разных ключей, срабатывает проверка, что второй ключ уже содержится в таблице.

Long story short: случается это не всегда, а когда ключем являются значения типа QUuid. QUuid должны содержать в себе рандомные 16 байт, но как оказалось, оба QUuid'а состояли из всех единичных битов! Но как же так? Оказывает, что Qt умеет определять поддержку процессором инструкции RDRAND, которая аппаратно выдает случайное число, и в моём случае процессор поддерживает эту инструкцию, так образом QUuid формировался с её помощью. Ну а почему вдруг аппаратная инструкция выдает вместо случайных чисел одни FF'ы? А оказывается в микрокоде AMD был баг, а у меня был не обновленный BIOS, который не содержал обновления микрокода.

Требуйте доливу пива после отстою пены обновления BIOS после получения новой тачки!