Spec-Zone.ru › GCC 8

13.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 о том, что статический конструктор или деструктор не используются, и обрезки их перед сканированием. Все найденные статические конструкторы и деструкторы будут обработаны, даже если модули, в которых они встречаются, не используются программой. Это может привести к увеличению размера исполняемого файла и непредсказуемым ссылкам на символы.

Далее: Недоразумения C++, Предыдущее: Стандартные библиотеки, Вверх: Проблемы [Оглавление][Индекс]

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

Spec-Zone.ru

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