Сопоставление типов va_list между компиляторами

У меня есть проект, состоящий из группы динамически загружаемых модулей. Первоначально все всегда создавалось с помощью MSVC 2003, но в последнее время я работал над тем, чтобы заставить его работать с GCC. Все идет довольно гладко, за исключением одной проблемы. Для 64-битного кода GCC и MSVC не согласны с тем, что такое va_list . Для 32-битной версии все в порядке. Проблема 64-битного несоответствия возникает, когда модуль, созданный с помощью одного компилятора, имеет общедоступную функцию с параметром va_list , и эта функция вызывается из модуля, созданного другим компилятором.

В спецификации говорится ничего о том, что такое va_list , за пределами раздела 7.15. Переменные аргументы , параграф 3:

Объявлен тип

va_list

, который является типом объекта, подходящим для хранения информации, необходимой макросам va_start , va_arg , va_end и va_copy .

Этот абзац просто означает, что все это зависит от компилятора - так есть ли способ заставить эти два компилятора согласовать содержимое 64-битного va_list ? Для наименьшего воздействия на мою систему, согласовать GCC с MSVC va_list было бы лучше, но я возьму любое решение, которое смогу найти.

Спасибо за помощь!

Изменить:

Я провел 32-битное тестирование , и у меня там тоже есть проблемы, что меня удивило, поскольку якобы нет различий в ABI между любыми 32-битными платформами Intel. Кодовая база MSVC, которую я использую, определяет все макросы вариативных функций как:

typedef char *va_list;
#define intsizeof(n)    ((sizeof(n) + sizeof(int) - 1) &~(sizeof(int) - 1))
#define va_start(ap, v) (ap = (va_list)&(v) + intsizeof(v))
#define va_arg(ap, t)   (*(t *) ((ap += intsizeof(t)) - intsizeof(t)))
#define va_end(ap)      (ap = (va_list)0)

Я немного упростил реальный проект, но это код, который я использовал для своего теста. С GCC этот код определенно неправильно получает мои аргументы. Может быть, это просто ошибка, как предлагает Зак ниже?

Отредактируйте еще раз:

Я получаю рабочие результаты для следующего 32-разрядного тестового приложения с -O0 , -O0 ] и -O2 , но не -O3 , -Os , Второй запуск - это медленный модульный тест ... Если [модульные тесты] не работают быстро, они не являются модульными тестами.

Я могу понять, почему 1/10 секунды - это слишком медленно, если у вас 30 000 тестов, так как на выполнение потребуется около часа. Однако означает ли это, что 1/11 секунды лучше? Нет, не совсем (так как это всего на 5 минут быстрее). Так что правило жесткого быстрого, вероятно, не идеально.

Таким образом, учитывая, насколько медленный является слишком медленным для модульных тестов, возможно, мне следует перефразировать вопрос. Как долго разработчик должен ждать завершения набора модульных тестов?

Приведем пример скорости тестирования. Взгляните на несколько значений продолжительности модульного теста MSTest:

0.2637638 seconds
0.0589954
0.0272193
0.0209824
0.0199389
0.0088322
0.0033815
0.0028137
0.0027601
0.0008775
0.0008171
0.0007351
0.0007147
0.0005898
0.0004937
0.0004624
0.00045
0.0004397
0.0004385
0.0004376
0.0003329

Среднее значение для всех 21 из этих модульных тестов составляет 0,019785 секунды. Обратите внимание, что самый медленный тест связан с использованием Microsoft Moles для имитации / изоляции файловой системы.

Итак, в этом примере, если мой набор модульных тестов вырастет до 10 000 тестов, его может работать более 3 минут.

27
задан Matt 29 September 2010 в 18:40
поделиться