Използвам рамката UnitTest++ за внедряване на модулни тестове върху някои C кодове, за които отговарям. Крайният продукт е вграден и използва const структури за съхраняване на конфигурационна информация. Тъй като целевият хост може да променя конфигурацията асинхронно, всички членове на структурата са непостоянни. Някои от структурите също са декларирани като летливи.
Получавам грешки при сегментиране, когато използвам 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 от екземплярите на struct не е опция (необходимо е данните да бъдат поставени във флаш), това изглежда е недостатък, с който ще трябва да живея.
const
квалифициран обект се различават. - person Jens Gustedt   schedule 01.02.2012