Spec-Zone.ru › GCC 4

11.6 Разочарования и недоразумения

Эти проблемы, возможно, прискорбны, но мы не знаем никакого практического способа их обойти.

  • Некоторые локальные переменные не распознаются отладчиками при компиляции с оптимизацией.

    Это происходит потому, что иногда GCC оптимизирует переменную, исключая её из существования. Нет способа сказать отладчику, как вычислить значение, которое такая переменная «должна была бы иметь», и неясно, что это вообще было бы желательно. Поэтому GCC просто не упоминает исключенную переменную при записи отладочной информации.

    Вы должны ожидать определённой степени расхождения между исполняемым файлом и исходным кодом при использовании оптимизации.

  • Пользователи часто считают это ошибкой, когда GCC сообщает об ошибке для кода такого вида:
    int foo (struct mumble *);
    
    struct mumble { ... };
    
    int foo (struct mumble *x)
    { ... }

    Этот код действительно содержит ошибку, поскольку область действия struct mumble в прототипе ограничена списком аргументов, содержащим его. Он не относится к struct mumble, определённой с объёмом файла непосредственно ниже — это два не связанных типа с похожими именами в разных областях действия.

    Однако в определении foo, используется тип с объёмом файла, поскольку он доступен для наследования. Таким образом, определение и прототип не совпадают, и вы получаете ошибку.

    Это поведение может показаться глупым, но именно это предписывает стандарт ISO. Достаточно легко заставить ваш код работать, переместив определение struct mumble выше прототипа. Не стоит создавать несовместимость с ISO C только для того, чтобы избежать ошибки для приведённого выше примера.

  • Доступ к битам даже в переменных типа volatile происходит путём доступа к более крупным объектам, таким как байт или слово. Вы не можете полагаться на размер объекта, который будет обращён для чтения или записи бита; он может даже изменяться для данного бита в зависимости от точного использования.

    Если вам важно контролировать объём памяти, который будет обращён, используйте volatile, но не используйте битовые поля.

  • GCC поставляется с скриптами оболочки для исправления определённых известных проблем в системных заголовочных файлах. Они устанавливают исправленные копии различных заголовочных файлов в специальный каталог, где GCC обычно будет их искать. Скрипты адаптируются к различным системам, ищут все системные заголовочные файлы по известным проблемным случаям.

    Если установлены новые системные заголовочные файлы, ничего автоматически не позаботится об обновлении исправленных заголовочных файлов. Их можно обновить, используя скрипт mkheaders установленном в libexecdir/gcc/target/version/install-tools/.

  • Например, на системах 68000 и x86 вы можете получить парадоксальные результаты, если проверять точные значения чисел с плавающей точкой. Например, вы можете обнаружить, что значение числа с плавающей точкой, которое не является NaN, не равно самому себе. Это происходит потому, что регистры с плавающей точкой хранят несколько дополнительных битов точности, чем помещается в double в памяти. Компилируемый код перемещает значения между памятью и регистрами с плавающей точкой по своему усмотрению, а перемещение их в память усекает их.

    Вы можете частично избежать этой проблемы, используя опцию -ffloat-store (см. Параметры оптимизации).

  • На платформах AIX и других платформах без поддержки слабых символов шаблоны должны быть явно проинстанцированы, и символы для статических членов шаблонов не будут сгенерированы.
  • В AIX GCC сканирует объектные файлы и библиотечные архивы на наличие статических конструкторов и деструкторов при линковке приложения до того, как линкер обрезает неиспользуемые символы. Это необходимо для предотвращения ошибочного предположения линкера AIX о том, что статический конструктор или деструктор не используются, и удаления их до начала сканирования. Все найденные статические конструкторы и деструкторы будут ссылаться, даже если модули, в которых они встречаются, не используются программой. Это может привести к увеличению размера исполняемого файла и неожиданным ссылкам на символы.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Disappointments.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API