Spec-Zone.ru › GCC 13

14.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 только для того, чтобы избежать ошибки в показанном выше примере.

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

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

  • 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-13.3.0/gcc/Disappointments.html

Spec-Zone.ru

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