Жуткие хаки
Nov. 22nd, 2007 12:51 pmРешил изредка постить про некоторые злобные хаки, которые приходится выполнять в процессе работы. Вот парочка.
Проект использует библиотеку IBPP. Проект поддерживает компиляторы от gcc-2.95 до 4-й ветки. gcc-2.95 не совсем полно поддерживает стандарт С++ версии 90-кудрявого года. В частности, у него отсутствуетшаблонный класс numeric_limits, который используется в библиотеке ibpp-2.5.3.1. Т.к. разработчики рекомендуют включать код библиотеки в проект - делаем маленький патчик, который возвращает нас к limits.h. Уродство, а что делать?
Этот-же проект вызывает ICE (Internal Compiler Error) при сборке с gcc 4-й ветки на x86_64. ICE на совершенно ровном месте. Путем последовательного коментирования кода приходим к выводу, что ICE возникает при присваивании полю структуры значения переменной которая мало того что extern, так еще и const volatile time_t! (К стати, в других местах кода присваивание проходит успешно). Что делаем? Т.к. бага проявляется только при включенной оптимизации, а переменная всегда кроме режима отладки равна time(NULL) добавляем пару директив препроцессора (при отладке используем переменную, при релизе - time(NULL)) и 1 пользовательский ворнинг: # warning "TODO: gcc v. 4.x generate ICE on x86_64"
Проект использует библиотеку IBPP. Проект поддерживает компиляторы от gcc-2.95 до 4-й ветки. gcc-2.95 не совсем полно поддерживает стандарт С++ версии 90-кудрявого года. В частности, у него отсутствуетшаблонный класс numeric_limits, который используется в библиотеке ibpp-2.5.3.1. Т.к. разработчики рекомендуют включать код библиотеки в проект - делаем маленький патчик, который возвращает нас к limits.h. Уродство, а что делать?
Этот-же проект вызывает ICE (Internal Compiler Error) при сборке с gcc 4-й ветки на x86_64. ICE на совершенно ровном месте. Путем последовательного коментирования кода приходим к выводу, что ICE возникает при присваивании полю структуры значения переменной которая мало того что extern, так еще и const volatile time_t! (К стати, в других местах кода присваивание проходит успешно). Что делаем? Т.к. бага проявляется только при включенной оптимизации, а переменная всегда кроме режима отладки равна time(NULL) добавляем пару директив препроцессора (при отладке используем переменную, при релизе - time(NULL)) и 1 пользовательский ворнинг: # warning "TODO: gcc v. 4.x generate ICE on x86_64"