C

GCC 10.0.1

Комплект засобів компілятора GNU було оновлено до версії 10.0.1. Видимі для користувачів зміни добре описано у the документації від розробників. Пакунки у Fedora 32 було перезібрано за допомогою нової версії компілятора.

Нові можливості та загальні удосконалення

  • Нові вбудовані функції:

    • Вбудованим оператором препроцесора __has_builtin можна скористатися для опитування щодо підтримки вбудованих функцій, які надаються GCC та іншими компіляторами, у яких передбачено їхню підтримку.

    • __builtin_roundeven для відповідної функції з ISO/IEC TS 18661.

  • Нові параметри командного рядка:

    • -fallocation-dce вилучає непотрібні пари операторів new та delete.

    • -fprofile-partial-training у новій версії можна скористатися для інформування компілятора про те, що шляхи у коді, які не покриваються тестовим запуском, не слід оптимізувати за розміром.

    • -fprofile-reproducible керує рівнем відтворюваності даних профілювання, зібраних за допомогою -fprofile-generate. Це уможливлює повторне збирання програми і тим самим результатом, що, зокрема, корисно для пакунків дистрибутивів.

  • Оптимізація міжпроцедурної взаємодії:

    • Етап міжпроцедурної скалярної заміни для агрегатів (IPA-SRA) було повторно реалізовано так, щоб він міг працювати під час компонування.

    • -finline-functions у новій версії увімкнено для -O2 і результат є кращим за співвідношенням розміру до швидкодії під час роботи. Також значно поліпшено вбудовану евристику для уникнення негативного впливу на час компіляції з -flto -O2.

    • У вбудованій евристиці та клонуванні функцій тепер може бути використано дані щодо діапазону значень для передбачення ефективності окремих перетворень.

    • Під час оптимізацій при компонуванні використовується правило одного визначення C++ для підвищення точності аналізу альтернатив на основі типів.

  • Оптимізація під час компонування:

    • Додано новий виконуваний файл lto-dump. Ця програма здатна створювати дампи різної інформації щодо файла об’єктного байт-коду LTO.

    • Паралельна фаза LTO може автоматично виявляти запущений сервер завдань make або може повертатися до резервної кількості доступних ядер обробки.

    • Байт-код LTO у новій версії може бути стиснено за допомогою алгоритму zstd. Скрипт налаштовування може автоматично виявляти підтримку zstd.

    • У новій версії більшість значень --param може бути вказано для кожного модуля трансляції окремо. Це стосується усіх параметрів, які керують оптимізацією вбудованих функцій та іншою міжпроцедурною оптимізацією. На відміну від попередніх версій, GCC 10 ігноруватиме параметри, які керують оптимізацією і які вказано під час компонування, і застосовуватиме параметри, які вказано під час компіляції у той самий спосіб, як це робиться для прапорців оптимізації.

  • Удосконалення оптимізації на основі профілювання:

    • Удосконалено механізми профілювання для нових мов та специфічних для мов Improvementsmaintenance під час компіляції та поділу коду в «гарячому» та «холодному» режимах.

    • Використано -fprofile-values, спеціально створений виконуваний файл, який може стежити за декількома значеннями (до 4) для, наприклад, опосередкованих викликів та надавати точніші дані профілювання.

Нові мови і специфічні для мов удосконалення

  • Для компіляторів C, C++ та Fortran реалізовано підтримку версії 2.6 специфікації OpenACC. Ознайомтеся із розділом щодо стану реалізації на сторінці вікі OpenACC та документацією із бібліотек середовища виконання, щоб дізнатися більше.

  • У новій версії в OpenMP і OpenACC передбачено підтримку вивантаження на графічні процесори AMD Radeon (GCN); реалізовано підтримку третього покоління Fiji (fiji) та п’ятого покоління VEGA 10/VEGA 20 (gfx900 або gfx906).

Сімейство C

  • Нові атрибути.

  • Нові попередження.

  • Удосконалення наявних попереджень.

C

  • Реалізовано підтримку декількох нових можливостей з нових модифікацій стандарту ISO C C2X. Відповідні можливості доступні, якщо вказано параметр -std=c2x або -std=gnu2x. Підтримку деяких з можливостей реалізовано у форматі розширень при компіляції для застарілих версій мови. Окрім вказаних вище можливостей, деякі можливості, які раніше було реалізовано як розширення, тепер додано до стандарту C і типово увімкнено у режимі C2X — вони не викликають попереджень, якщо використано -std=c2x -Wpedantic.

  • Типовим для нової версії GCC є використання -fno-common. У результаті доступ до глобальних змінних став на багатьох платформах ефективнішим. У C використання глобальних змінних із декількома пробними визначеннями тепер призводить до помилок під час компонування. Якщо вказати -fcommon, такі визначення буде без попередження об’єдано під час компонування програми.

C++

  • Було реалізовано декілька можливостей C++20.

  • Виправлено декілька вад, пов’язаних зі звітами C++ Defect.

  • Нові попередження.

  • Нова версія G++ виявлення зміни у сталих об’єктах під час оброки за допомогою constexpr (виявляє невизначену поведінку).

  • Нова версія G++ більше не виводить непотрібних попереджень щодо -Wsign-conversion при явних викликах.

  • Реалізовано виявлення звуження у ширших контекстах (наприклад, у значеннях випадків).

  • Зменшено споживання компілятором пам’яті при обробці constexpr.

  • У новій версії noexcept-specifier обробляється належним чином як контекст цілого класу за [class.mem].

  • Атрибут deprecated у новій версії можна використовувати і для просторів назв.

Бібліотека середовища виконання (libstdc++)

  • Удосконалено, зокрема, експериментальну підтримку C++2a.

  • Реалізовано підтримку RDSEED у std::random_device.

  • Зменшено залежності заголовків, що пришвидшить компіляцію частини коду.

Бібліотека C GNU версії 2.31

До складу Fedora 32 включено бібліотеку GNU C — glibc — версії 2.31. Серед помітних змін у ній:

Нові можливості

  • У новій версії бібліотеки GNU C передбачено макрос для тестування можливостей _ISOC2X_SOURCE, який надає змогу вмикати можливості з чернетки стандарту ISO C2X. У бібліотеці GNU C передбачено лише частину з можливостей чернетки, і, оскільки чернетка перебуває у активній розробці, набір можливостей, які вмикаються цим макросом, ймовірно, зміниться. Можливості з C2X також вмикаються за допомогою _GNU_SOURCE або компіляції з gcc -std=gnu2x.

  • Функції <math.h>, у яких округлення результатів відбувається до вужчого типу, у новій версії мають макроси загального типу у <tgmath.h>, як це визначено у TS 18661-1:2014 і TS 18661-3:2015, які випущено на розв’язання запитів щодо роз’яснення 13 у TS 18661-3.

  • Було додано функцію pthread_clockjoin_np, яка вмикає об’єднання із перерваною гілкою виконання із специфічним годинником. Вона уможливлює очікування за CLOCK_MONOTONIC і CLOCK_REALTIME. Ця функція є розширенням GNU.

  • Додано нову локаль: mnw_MM (мова мон, якою розмовляють у М’янмі).

  • Розв’язувач «заглушок» DNS може надсилати біт AD (authenticated data) у запитах, якщо встановлено параметр trust-ad option за допомогою інструкції options у /etc/resolv.conf (або якщо для RES_TRUSTAD встановлено значення _res.options). У цьому режимі біт AD, який надано сервером назв, доступний програмам, які викликають res_search і пов’язані функції. У типовому режимі біт AD не встановлюється у запитах і автоматично знімається у відповідях, що позначає, що перевірка DNSSEC не проводилася. (Через це сервери назв і мережеві шляхи до них вважаються ненадійними.)

Можливості, які визнано застарілими і вилучено

  • Функції totalorder і totalordermag та відповідні функції для інших типів з рухомою крапкою тепер приймають аргументи для запобігання надсиланню сигналів NaN, які може бути перетворено на «тихі» NaN при передаванні аргументів. Це зроблено відповідно до розв’язання запиту щодо роз’яснення 25 до TS 18661-1, відповідно до C2X. Наявні виконувані файли, які передають аргументи із рухомою крапкою безпосередньо, мають лишитися працездатними.

  • Застарілою функцією stime більше не можна користуватися для скомпонованих заново виконуваних файлів. Її оголошення було вилучено з файла <time.h>. У програмах, які встановлюють загальносистемний час, має бути використано clock_settime.

  • Ми плануємо вилучити застарілу функцію ftime та заголовок <sys/timeb.h> в одній з наступних версій glibc. У цьому випуску заголовок ще є, але виклик ftime призводити до попередження з боку компілятора. Усі програми мають використовувати gettimeofday або clock_gettime.

  • Функція gettimeofday більше не повідомляє даних щодо загальносистемного часового поясу. Ця можливість ери 4.2-BSD вважалася застарілою уже багато років, оскільки у ній не було передбачено усіх аспектів складної системи часових поясів світу, але ми підтримували її з міркувань підтримання сумісності. Зміни, які знадобилися для реалізації підтримки 64-бітових значень часу time_t на 32-бітових архітектурах призвели до того, що подальша підтримка втратила сенс.

  • Функцією settimeofday все ще можна користуватися для встановлення загальносистемного часового поясу, якщо в операційній системі передбачено підтримку відповідного встановлення. Причина полягає у тому, що у ядрі Linux повторно використано програмний інтерфейс, на деяких архітектурах, для опису загальносистемного зсуву часу, подібного до часового поясу між значенням програмного годинника, яке зберігається у ядрі, і годинником «RTC», який зберігає час, коли система вимикається.

  • Підтримку SPARC ISA v7 припинено. Підтримку v8 продовжено, але лише якщо реалізовано додаткову інструкцію CAS (наприклад, підтримку процесорів LEON продовжено, але підтримку процесорів SuperSPARC припинено).

  • Якщо під час виконання dlopen стається помилка «лінивої» прив’язки, під час виконання конструктора ELF у новій версії процес буде перервано. У попередніх версіях динамічний компонувальник повернув би NULL з dlopen, а помилку «лінивої» прив’язки було б перехоплено у повідомленні dlerror. Загалом, такий спосіб обробки не є безпечним, оскільки скидання стека у виклику довільної функції є неможливим.

  • Для бінарних інтерфейсів MIPS із жорсткою рухомою крапкою бібліотеку GNU C буде налаштовано так, що їй потрібен буде стос виконання, якщо під час збирання її не було явним чином налаштовано на роботу із мінімальною версією ядра 4.8. Причиною є те, що виконання гілок обробки чисел із рухомою крапкою на невиконуваному стосі у ядрах Linux до 4.8 могло приводити до аварійних завершень роботи програм для деяких конфігурацій MIPS. Хоча зараз PT_GNU_STACK не використовується на MIPS досить широко, майбутні випуски GCC, як очікується, типово вмикатимуть невиконуваний стос із PT_GNU_STACK, а отже, ймовірно, спричинятимуть аварійні завершення роботи програм на застарілих ядрах.

  • Загальносистемні обробки викликів системного часу у новій версії використовують нову систему викликів time64, якщо така доступна. На 32-бітових архітектурах ці обгортки намагаються спочатку викликати нові загальносистемні виклики і повертаються до старих 32-бітових системних викликів, якщо нових не вдасться виявити. Це може спричинити проблеми у середовищах, які не можуть обробляти непідтримувані загальносистемні виклики без помилок, повертаючи -ENOSYS. Ця проблема є характерною для «пісочниць» Seccomp.

Зміни, пов’язані із безпекою

  • CVE-2019-19126: ld.so не може ігнорувати змінну середовища LD_PREFER_MAP_32BIT_EXEC під час виконання програми після переходу безпеки, що уможливлює для локальних нападників обмежити діапазон можливих адрес прив’язки для завантажених бібліотек і, таким чином, обійти ASLR для програми з setuid. Повідомлено Марцином Кошельніцьким.

Докладні відомості щодо glibc-2.31 можна знайти у документі NEWS від розробників; зауважте, що вам слід гортати документ до версії 2.31, оскільки оновлення документа триває паралельно із розробкою.

mpfr 4.0.2

До складу Fedora 32 включено бібліотеку GNU MPFR версії 4.0.2. Серед помітних змін у ній:

  • У новій версії mpfr передбачено підтримку спільних кешів для багатопотокових програм, що зменшить вжиток пам’яті.

  • Удосконалено кешування: гарантовано мінімальне збільшення точності 10% для уникнення надто великої кількості повторних обчислень, а отже, зменшено навантаження на процесор.

  • Використано буфер малої точності mpz_t для зменшення кількості дій з отримання пам’яті, а отже, зменшено навантаження на процесор.

  • Декілька функцій у новій версії працюють швидше, зокрема mpfr_add, mpfr_sub, mpfr_mul, mpfr_div, mpfr_sqrt, mpfr_set_d і mpfr_get_d.

  • Функція mpfr_div_ui могла давати помилково округлені результати у mpfr 3; цю ваду виправлено у mpfr 4.

Щоб дізнатися більше, ознайомтеся із нотатками щодо випуску версій 4.0.0, 4.0.1 і 4.0.2.