Я использую инфраструктуру UnitTest ++ для реализации модульных тестов в коде C, за который я отвечаю.Конечный продукт встроен и использует структуры const для хранения информации о конфигурации.Поскольку целевой хост может асинхронно изменять конфигурацию, все члены структуры являются энергозависимыми.Некоторые из структур также объявлены как volatile.
Я получаю ошибки сегментации, когда использую const_cast, чтобы попытаться изменить экземпляры структуры, в которых отсутствует ключевое слово volatile на хосте UnitTest Windows 7.Это имеет смысл для меня.Однако, если экземпляр структуры был объявлен с ключевым словом volatile, то тест проходит успешно.Это не имеет смысла для меня.
Вот краткий пример кода, который показывает проблему с gcc на Win7.Переключение определения значения приводит к тому, что segfault появляется или нет, в зависимости от того, используется ли volatile экземпляр структуры или нет.
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.звонки.Однако, поскольку удаление const из экземпляров структуры не является вариантом (необходимо, чтобы данные помещались во флэш-память), это является недостатком, с которым мне придется смириться.