Я использую фреймворк UnitTest ++ для реализации модульных тестов некоторого кода C, за который я отвечаю. Конечный продукт встроен и использует константные структуры для хранения информации о конфигурации. Поскольку целевой хост может изменять конфигурацию асинхронно, все члены структуры являются энергозависимыми. Некоторые структуры также объявлены нестабильными.
У меня возникают ошибки сегментации, когда я использую const_cast, чтобы попытаться изменить экземпляры структуры, у которых отсутствует ключевое слово volatile на хосте UnitTest Windows 7. Для меня это имеет смысл. Однако, если экземпляр структуры был объявлен с ключевым словом volatile, тест проходит. Для меня это не имеет смысла.
Вот быстрый пример кода, который показывает проблему с gcc в Win7. Переключение значения определения вызывает появление segfault или нет, в зависимости от того, используется ли изменчивый экземпляр структуры или нет.
typedef struct
{
volatile int foo;
volatile int bar;
} TestStruct;
const TestStruct constStruct = { 1, 2};
volatile const TestStruct volatileConstStruct = { 3, 4};
#define SEG_FAULT 0
int main(void)
{
TestStruct * constPtr = const_cast<TestStruct*>(&constStruct);
TestStruct * constVolPtr = const_cast<TestStruct*>(&volatileConstStruct);
#if(SEG_FAULT == 0)
constVolPtr->foo = 10;
#else
constPtr->foo = 20;
#endif
}
Может ли кто-нибудь помочь мне понять, почему ключевое слово volatile представляет собой обходной путь для segfault? Кроме того, может ли кто-нибудь предложить метод, позволяющий мне изменять значения в структуре для модульного теста без добавления ключевого слова volatile ко всем экземплярам структуры?
РЕДАКТИРОВАТЬ:
Я только что обнаружил, что это можно сделать на C:
#define const
Включение эффективного "const undefine" выше в тестовое приспособление позволяет моему целевому компилятору видеть ключевое слово const и правильно размещать структуры во флеш-памяти. Однако препроцессор компилятора UnitTest ++ удаляет ключевое слово const, поэтому мой тестовый прибор может изменять структуру.
Недостатком этого решения является то, что я не могу добавлять модульные тесты, которые проверяют правильность константной операции вызовов функций. Однако, поскольку удаление константы из экземпляров структуры не является вариантом (необходимо, чтобы данные были помещены во флэш-память), это, по-видимому, является недостатком, с которым мне придется смириться.
const
квалифицированным объектом, различаются. - person Jens Gustedt   schedule 01.02.2012