LINUX.ORG.RU

GCC 15 ломает код сишникам

 , ,


1

6

Привет, ЛОР!

Из-за того, что GCC по умолчанию переходит на стандарт C23 для компилируемого кода, возникли некоторые интересные нюансы. Так например, начиная с C23 пустой список аргументов у функции теперь будет считаться объявлением с void. То есть, следующие два объявления будут эквивалентными:

void f1() { }
void f2(void) { }

Это крохотное изменение внезапно сломало вагон и маленькую тележку программ под Linux, где используется этот трюк для передачи в функцию по указателю различных аргументов:

typedef int (*fptr)();

int f1(void) { return 1; }
int f2(int a) { return 2 + a; }

int main(void) {
  fptr f;
  int r = 0;
  f = f1;
  r += f();
  f = f2;
  r += f(1);

  return r;
}

Подобный код больше не будет собираться. Сломанными оказались такие программы как: Linux (ядро), bash, iwd, samba, bluez, rustc, gnupg, vde2, sudo, gdb, postgresql, guile, w3m, freeglut, neovim, dnsmasq и куча других.

Бонусом к этому будет добавленный в mbedtls (и не только) баг, вызванный иным порядком инициализации union.

int main() {
  union {
    int dummy;
    struct { int fs[4]; } s;
  } v = { 0 };
  printf("%d\n", v.s.fs[3]);
  return 0;
}

В gcc 14 и ранее код выведет 0, начиная с gcc 15 – мусор.

Плюс ко всему, bool, true и false теперь ключевые слова, что тоже ломает кучу кода. В общем, сишников ждут интересные времена и много работы по исправлению костылей. Возрадуемся же!

За наводку можно поблагодарить забавнишегося @sf:

Ответ на: комментарий от firkax

По аргументам и должно быть понятно, сколько их пришло. Так же как printf знает сколько у него аргументов. Это не очень хорошая идея, но реализовать это можно.

jpegqs
()
Последнее исправление: jpegqs (всего исправлений: 1)
Ответ на: комментарий от firkax

Сколько передали должно совпадать с тем сколько функция определит, если нет - то это ошибка в программе. Даже если это не stdcall, просто для stdcall последствия могут быть серьёзнее.

jpegqs
()
Ответ на: комментарий от jpegqs

Передать в va args можно сколько угодно, лишь бы не меньше, чем в строке формата указано. В cdecl по этой причине стек чистит вызывающая сторона.

А stdcall не родной протокол для сишечки, для такого не предназначен.

wandrien ★★
()
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от jpegqs

Нет, не ошибка. С одной стороны, функция совершенно не обязана забирать все переданные аргументы, главное чтоб не пыталась забрать те которых не было. Во-вторых, с практической стороны может быть что-то вида

printf(flag?"%s %s":"%s Q", s1, s2);

где в зависимости от флага выводится разные формат, в одном из них используются оба аргумента, во втором только один. Это полностью нормальный код, он даже никакую комитетскую графоманию не нарушает и ломать его нельзя.

firkax ★★★★★
()
Ответ на: комментарий от wandrien

О подходе к проектировании ЯП

tl;dr

и тем менее качественным получается продукт. Поэтому одним из главных факторов эффективности ЯП как инструмента являются те характеристики, которые помогают программисту выявлять ошибки. Синтаксис и семантика данного языка проектируются так, чтобы по возможности максимизировать такие характеристики.

в любом случае, это не про сишку (и уж тем более – не про плюсишку).

вот перечитал я эту драму про Andrew Tomazos:

  • First-hand Account of «The Undefined Behaviour Question Incident»

  • P3403r0.pdf «The Undefined Behaviour Question»

а что, ведь прав мужик, по сути дела-то. а комитет – нет, ибо большинство всегда неправо

суть вопроса в расовом окончательном разрешении UB вопроса –

«Should undefined operations be allowed to affect observable operations that happen before them?»

то есть, в терминах этой вашей квантовой механики, lesswrong.org Элайзера Юдковски про парадоксы и эксперименты квантовой механики, и этого нашего всего Девида Дойча Структуры реальности – проста по сути и безблагодатна :

мы изучаем саму реальность, то есть: (моделируемый объект) или её модель (модель этого объекта) или её метамодель (модель операционной семантики, например, этого объекта; парадоксы причинности и перемещения во времени; или какую-то уже метафизику: квантовый телефон Тальмира, ч0рные дыры Керра, мосты и точе-червие Эйнштейна-Бозена и прочий STEINS;GATE с мировыми линиями многомерного времени, тахионными кристаллами и прочими н-бранами с коэффициентами дивергенции линий альфа и бета)

такое ощущение, что скорее всего – уже второе. и этим занят целый комитет прозаседавшихся, ох, лолЪ….

суть вопроса предельно ясно описана в вот той работе и довольно безблагодатна:

из-за совместимости сверху вниз С23, С++23 – модель операционной семантики неполна и некорректна: в смысле частичной а не тотальной корректности операционной семантики абстрактного исполнителя, модели памяти и его операционной семантики, описанной в стандартах.

p3403r0.pdf:

Q8. How do previous C and C++ standards answer The Question?

A8. The status of previous standards is as follows:
- The C11 standard (and previous) gave an ambigous answer. There is no consensus on how it answered The Questions.
- The C++23 standard (and previous) gave an unambiguous YES answer to The Question.
- The C23 standard gives an unambiguous NO anwser to The Question (due to the adoption of WG14:N3128 by WG14(

вот суть и корневая причина этих The Breaking newsа разгадка проста, операционная семантика C23 и C++23 определена по разному (и всё равно, безблагодатно)

вспоминается аж Н. Непейвода «О формализации неформализуемых понятий» где тоже любопытный подход к формально корректной формализации (не)формализуемого. ну то есть: не если не в рамках системы, по отдельности; но в рамках системы и подхода, то есть, целой сети частично корректно (а не тотально) определённой семантики – вполне таки да.

или тот же самый лисп изначальный, из определения Маккарти. там дан пример рекурсивной раскрутки метаинтерпретатора таким образом, что несмотря на кажущуюся причинность – в реальности происходит не тоже самое, что и на самом деле: определяются предикаты и функции частично, а не тотально; но рекурсивная раскрутка возникает таким образом, что используется это таким образом, что никаких парадоксов квантового наблюдателя не возникает, строго по вот такому (а не такому, как в С++) определению.

enjoy your C++, как говорится.

а в комитете там копья ломают, дескать название «The Ultimate Behaviour Question» неполиткорректное.

ответ же на него предельно простой: 42!а разгадка проста: безблагодатность.

вот до чего bug-oriented совместимость сишки и плюсишки сверху вниз доходит, лолЪ.

нет бы определить заново и полностью корректно, как в том же ML или там Аде и SPARK. или ещё лучге агде.

или там ISLISP и схема, например. а не 10500 страниц очередного стандарта Common Lisp++.

anonymous
()
Ответ на: комментарий от zx_gamer

Чтоб вам в аду дьявол совместимость костей позвоночника ломал!

Да ладно, сишечка никогда особо не была совместима сама с собой. Всем это прекрасно известно.

hateyoufeel ★★★★★
() автор топика