2016-08-12 2 views
2

У меня есть команда в моем make-файле, которая использует Qt resource compiler.
Эта утилита создает статический массив для каждого файла изображения, переданного ему.
К сожалению, rcc.exe не является детерминированным: порядок этих массивов внутри сгенерированного файла .cpp отличается для каждого вызова.
qt rcc (resource compiler) не является детерминированным - как сделать его детерминированным

Я побежал его три раза:

>C:\rcc.exe -name lookupmodels lookupmodels.qrc -o .qrc/qrc_lookupmodels-1.cpp 

>C:\rcc.exe -name lookupmodels lookupmodels.qrc -o .qrc/qrc_lookupmodels-2.cpp 

>C:\rcc.exe -name lookupmodels lookupmodels.qrc -o .qrc/qrc_lookupmodels-3.cpp 

Файл .qrc является:

<RCC> 
    <qresource prefix="/"> 
     <file>datapool_pdal1.csv</file> 
     <file>events_Ic.csv</file> 
     <file>events_Evt.csv</file> 
     <file>events_Other.csv</file> 
     <file>key_events.csv</file> 
     <file>loglevel_DPvalues.csv</file> 
     <file>loglevel_Evtvalues.csv</file> 
     <file>log_freqDP.csv</file> 
    </qresource> 
</RCC> 

Being массивы static const unsigned char, что .cpp файлы огромны, так что я не буду показывать их здесь, но Основная проблема заключается в том, что порядок этих массивов, представляющих изображения, изменяется от одного вызова к другому.

ВЫПУСКА

Для сравнения строить строить - особенно, так как я переключение строить системы - мне нужно, чтобы иметь возможность сравнить артефакты.

Я бы хотел, чтобы они не менялись, поэтому я могу сравнивать вывод артефакта из сборки для сборки, чтобы увидеть, что-то изменилось или нет.

Это ТОЛЬКО объектный файл, который дает мне эту проблему.

+0

Очевидно, что тогда вы не должны полагаться на порядок ресурсов. К ресурсам обращаются имена/пути (как определено в .qrc), а не их порядок в файлах .cpp. –

+0

@ VioletGiraffe порядок массивов ресурсов влияет на файл объекта, который влияет на мой окончательный исполняемый файл. Как еще я должен сравнивать исполняемые файлы между сборками? – Adrian

+1

Я вижу, я пропустил последний бит вопроса. Но вы не можете реально ожидать, что ваши двоичные файлы будут соответствовать бит-биту в любом случае. По крайней мере, мои никогда не делают, у них есть такие вещи, как случайные идентификаторы и дата/время. –

ответ

3

Скорее всего, это случайно; внутренне, RCC использует QHash где-то, который использует случайное зерно в его хэш-функции:

http://interest.qt-project.narkive.com/HsoMhGOu/qt-resource-compiler-why-does-it-randomize-the-order-of-items

это связано с хэш-рандомизации. Это было сделано, чтобы избежать DoS-атак, которые могут быть выполнены , путем настройки данных, чтобы гарантировать, что он всегда попадает в тот же хэш-ведро.

Для того, чтобы сделать хэш семян неслучайной (и, таким образом, сделать RCC детерминированным) установить переменную окружения QT_HASH_SEED для некоторого фиксированного числового значения перед вызовом RCC.

Эта рандомизация QHash включена по умолчанию. Несмотря на то, что программы никогда не должны зависеть от конкретного заказа QHash, могут быть ситуации, когда вам временно необходимо детерминированное поведение, например, для тестирования отладки или регрессии. Чтобы отключить рандомизацию, определите переменную среды QT_HASH_SEED. Содержимое этой переменной, интерпретируемое как десятичное значение, будет использоваться как семя для qHash(). Кроме того, вы можете вызвать функцию qSetGlobalQHashSeed().

http://doc.qt.io/qt-5/qhash.html#algorithmic-complexity-attacks


Во всяком случае, пластырь об этой проблеме has been merged (больше в общем, это должно решить подобные проблемы даже в МСЖД и МОС), поэтому последние версии Qt не должны быть затронуты.

+0

ужасно, но я действительно хочу знать: как вы нашли эту информацию? Просто googling «QT randomize»? – Adrian

+1

Ссылка на список рассылки была третьим хитом Google для «qt rcc воспроизводимой сборки»; там я нашел упоминание о «QT_HASH_SEED», которое затем я искал и сразу обнаружил в документации «QHash». Рад, что помогло. знак равно –

Смежные вопросы