пятница, 6 февраля 2009 г.

Сборка без warnings

Довелось работать с модулями системы, которые девелопил не я. Первым делом попробовал собрать.
Не знаю, как кого, но сборка с warnings лично меня сильно напрягает.
Поэтому, я решил причесать их немного.

Одно из проблемыных мест было множественно сообщение компилятора
"deprecated conversion from string constant to 'char *'".
Раньше модули собирались gcc версии 3.4, а сейчас 4.2, поэтому сборка была более тихая.

Код оказался винегредом из С и С++, причем для строк использовался именно char *,
менять на std::string было бы долго и неоправданно. Как оказалось, проблема была в следующем:

void addpack(std::vector<uint8_t>& c, char * formatt,...) {
    // большой switch, проверяющий посимвольно значение ключей
}

void addPack64(std::vector<uint8_t> &c, uint64_t iValue) {                                                            
    addpack(c, "N", (uint32_t)(iValue >> 32) );              
    addpack(c, "N", (uint32_t)(iValue & 0xffffffffUL));
}



Как видно из кода, функции addpack передавался указатель на локальную константную строку с возможностью изменения ее содержимого.

В качестве решения, параметр char * formatt был заменен на const char * formatt.

Комментариев нет: