The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Выпуск набора компиляторов GCC 7.2

14.08.2017 23:58

Доступен корректирующий релиз набора компиляторов GCC 7.2, в котором проведена работа по исправлению ошибок, регрессивных изменений и проблем с совместимостью. По сравнению с версией GCC 7.1 в GCC 7.2 отмечено 95 исправлений, в основном связанных с устранением регрессивных изменений. Напомним, что начиная с ветки GCC 5.x в проекте внедрена новая схема нумерации выпусков: версия x.0 используется в процессе разработки, корректирующие выпуски формируются с номерами x.2.0, x.3.0 и т.д. Новые возможности развиваются в экспериментальной ветке GCC 8.0, на базе которой будет сформирован следующий значительный релиз GCC 8.1.

  1. Главная ссылка к новости (https://gcc.gnu.org/ml/gcc-ann...)
  2. OpenNews: Релиз набора компиляторов GCC 7
  3. OpenNews: В состав GCC одобрено включение языка программирования D
  4. OpenNews: Ошибка в GCC привела к игнорированию режима выявления проблем с форматированием строк
  5. OpenNews: Для GCC представлен бэкенд c реализацией WebAssembly
Лицензия: CC-BY
Тип: Программы
Ключевые слова: gcc
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (42) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Аноним (-), 00:40, 15/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –14 +/
    А позор типа
    for (int n = 0; n < arr_length; ++n) make_zashibis(arr[n]);
    ...
    if (arr) { ... } /* выкинуто gcc по причине undefined behaivour */

    GNU-макаки исправили или нет ??

     
     
  • 2.3, Аноним (-), 00:46, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +12 +/
    Выкинуть нужно анонима. А gcc всё сделал правильно
     
     
     
    Часть нити удалена модератором

  • 4.7, Crazy Alex (ok), 01:36, 15/08/2017 [ответить]  
  • +2 +/
    Ты полный пример можешь дать? И версию компилятора заодно...

    Потому что при таком вызове arr у тебя измениться не может, только его содержимое.

     
     
  • 5.9, Аноним (-), 01:58, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –3 +/
    GCC6.3 и старая opera , моя прелесть
     
     
  • 6.12, Ordu (ok), 04:03, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Это просто сотрясения воздуха, а не ответ на вопрос.

    Смотри, берём такой код:

    void foo(int);
    int bar(int **);
    void baz();

    int main()
    {
    int *arr;
    int arr_len = bar(&arr);
    for(int n = 0; n < arr_len; n ++)
    foo(arr[n]);
    if(arr)
    baz();
    return 0;
    }

    Вызываем gcc:
    gcc -O2 -S tmp.c -Wall -fverbose-asm
    Получаем:
    main:
    .LFB0:
    .cfi_startproc
    pushq %rbp #
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    pushq %rbx #
    .cfi_def_cfa_offset 24
    .cfi_offset 3, -24
    subq $24, %rsp #,
    .cfi_def_cfa_offset 48
    movq %rsp, %rdi #,
    movq %fs:40, %rax #, tmp106
    movq %rax, 8(%rsp) # tmp106, D.1788
    xorl Йx, Йx # tmp106
    call bar #
    testl Йx, Йx # arr_len
    jle .L6 #,
    subl $1, Йx #, tmp101
    xorl Кx, Кx # ivtmp.7
    leaq 4(,%rax,4), %rbp #, _26
    .p2align 4,,10
    .p2align 3
    .L5:
    movq (%rsp), %rax # arr, arr
    movl (%rax,%rbx), Мi # *_10, *_10
    addq $4, %rbx #, ivtmp.7
    call foo #
    cmpq %rbp, %rbx # _26, ivtmp.7
    jne .L5 #,
    .L6:
    cmpq $0, (%rsp) #, arr
    je .L4 #,
    xorl Йx, Йx #
    call baz #
    .L4:
    xorl Йx, Йx #
    movq 8(%rsp), %rdx # D.1788, tmp107
    xorq %fs:40, %rdx #, tmp107
    jne .L11 #,
    addq $24, %rsp #,
    .cfi_remember_state
    .cfi_def_cfa_offset 24
    popq %rbx #
    .cfi_def_cfa_offset 16
    popq %rbp #
    .cfi_def_cfa_offset 8
    ret
    .L11:
    .cfi_restore_state
    call __stack_chk_fail #
    .cfi_endproc
    .LFE0:
    .size main, .-main
    .ident "GCC: (Gentoo 6.3.0 p1.0) 6.3.0"
    .section .note.GNU-stack,"",@progbits

    Метка .L6 это тот самый if, который по твоим словам должен быть выкинут из-за UB. И мы чётко видим, что он не выкидывается.

    edit: форум смешно покорёжил att синтаксис. Но суть видна и так.

     
     
  • 7.18, Другойаноним (?), 09:45, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Тем не менее,было такое дело , было  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49820
     
     
  • 8.28, pripolz (?), 12:16, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    так та бага вообще не о том Там юзер хотел проверить int на переполнение Ему... текст свёрнут, показать
     
  • 7.27, Iaaa (ok), 12:16, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Можно было просто дать ссылку https://godbolt.org/g/Wy4TPn
    И нагляднее, и проще.
     
  • 4.29, Аноним (-), 13:08, 15/08/2017 [ответить]  
  • +/
    То есть ты сначала разыменовываешь указатель, а потом проверяешь, не нулевой ли он? Молодец, чё.
     
     
  • 5.52, УЖАС СОВКА (?), 12:57, 16/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    А в чем проблема ?? Если N<0, он и не разименовывается.
     
  • 2.8, asdasdasd (?), 01:56, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Вы сами написали: "/* выкинуто gcc по причине undefined behaivour */".
    Неопределенное поведение потому оным и зовется, что оно неопределенное и в стандарте не прописано.
     
     
     
    Часть нити удалена модератором

  • 4.11, Crazy Alex (ok), 03:07, 15/08/2017 [ответить]  
  • +8 +/
    Не, нормальные люди не допускают UB. Хотя выше пример исковеркан - к примеру, там, вероятно, if (!arr) имелось в виду. И навреняка ещё куча всего покалечена, так что не понять. Где там те исходники оперы ловить - не знаю и разбираться не хочу. Охота возиться с варезом - флаг в руки. Или ещё куда.
     
     
  • 5.17, Аноним (-), 09:28, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –3 +/
    ИМХО UB должно не компилироваться или компилироваться, но не выкидываться, т.к. это уже UB^2 ( но это лишь моё мнение основанное не на тоннах непонятного кода а на аналогией с жизнью в реальном мире и правилах по технике безопасности, хотя последнее время читая посты про вживление ИТ мира в реальность складывается впечатления что они слишком ортогональны )
     
  • 3.24, anonymous (??), 11:16, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Вообще-то, в стандарте С как раз описано неопределённое поведение.
     
  • 2.16, Аноним (-), 09:15, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Используй clang, какие проблемы то?
     
  • 2.22, Comdiv (ok), 11:08, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Да, это ошибка компилятора, но что тут позорного? Хорошую оптимизацию сделать сложно, а при создании сложных вещей легче ошибиться, чем при создании "Hello, world". Поэтому когда программист включает оптимизацию, он должен понимать, что делает. Также он должен понимать, что люди ошибаются, кроме него самого, разумеется.
     
  • 2.31, freehck (ok), 14:44, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > GNU-макаки исправили или нет ??

    Ну макак я, допустим, ещё пропущу, но вот пи#####ов держите пожалуйста при себе. ;)
    Нецензурщину в треде вырезал.

     
     
  • 3.35, Ан (??), 15:42, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Нецензурщину в треде вырезал.

    Ты конечно молодец, но у тебя это вышло откровенно говоря фигово. Лучше бы ты её зацензурил. А то в итоге вырезал и кусок кода который обсуждали вверху. И получили мы обсуждение без начала.
    Так держать модераторы.

     
  • 2.48, УЖАС СОВКА (?), 20:13, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    В общем, на сей случай есть набор ключей,который придется теперь писать везде
    -fno-strict-aliasing
    -fno-strict-overflow
    -fwrapv
    -fno-delete-null-pointer-checks
     

  • 1.13, Аноним (-), 04:57, 15/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • +8 +/
    Диванные хаятели gcc в треде! все в машину!

    Сколько себя помню, уже 15 лет сознательной окололинуксовой жизни, натурально считается образцом поведения невзначай упомянуть фразу "глюки GCC". Это поднимает ЧСВ у хацкеров. Ведь не ваш г0внокод виноват, а нехороший такой компилятор!

     
     
  • 2.14, Аноним (-), 08:01, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Чаще всего все глюки из-за оптимизации. И они действительно есть. Один очень хорошо повторялся: strlen на пустой строке сегфолтился по выходу за пределы строки (\0 точно был). Возможно неверно запомнил, но поведение примерно такое было. Не хочется глюков, -O0. Вот и всё.
     
  • 2.15, Аноним (15), 09:14, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Если бы не gcc - где бы час находился бы наш мир!!
    А гляки/баги есть везде!(в оприори) - где то больше где то меньше, но это не важно для ядерной станции....

     
     
  • 3.34, Аноним (-), 15:15, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Он был бы несомненно лучше и удобнее
     
  • 2.32, Аноним (-), 14:53, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Учитывая, что я лично нашёл не менее 5 примёров, когда GCC генерировал плохой код, то даже не знаю.

    Причем в паре раз это было kernel miscompilation leading to kernel panics/Ooops'es.

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

    // b.

     
     
  • 3.47, llolik (ok), 20:06, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Впрочем, с другими компиляторами так тесно не общался, и могу предположить

    Есть такой линкер под оффтопик UniLink (ftp://ftp.styx.cabel.net/pub/UniLink/). Неплохой линковщик, который много чего умеет (линковать объектники от разных компиляторов, например, в том числе и gcc). Почитать его довольно большой history (там ещё и от ранних релизов архив лежит), в котором то и дело "Добавлено <что-нибудь> для очередной ошибки <компилятора>", немного удивляешься, как оно вообще в принципе работает и сколько в этом всём костылей.
    UniLink привожу потому, что он не привязан к "особенностям" конкретного компилятора, и поэтому автору приходится много работать, чтобы обойти все эти особенности.

     

  • 1.36, pripolz (?), 15:48, 15/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Наткнулся на такую засадку небольшую в ГЦЦ:
    Не считает поле "int" в "const union" за "const int".

    Из-за этого такое поле нельзя вставить в switch/case...
    Мелочь, а неприятно.

    Вот например такой код не компилится.

    http://rextester.com/EOQCD80556

    Со мной всё в порядке?

     
     
  • 2.37, pripolz (?), 15:55, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Не считает поле "int" в "const union" за "const int".

    Если копнуть эту тему глубже, то получается, что он скорее всего собирает этот const union в рантайме, что тоже не хорошо..

     
     
  • 3.38, pripolz (?), 16:03, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > скорее всего собирает этот const union в рантайме

    не, не подтвердилось

    https://godbolt.org/g/P15iqG

     
     
  • 4.39, pripolz (?), 16:10, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Вообще ни один компилер не компилит.

    https://godbolt.org/g/RhZjwA

    Щас на раст перейду с джавой.

     
  • 2.40, Аноним84701 (ok), 16:17, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Наткнулся на такую засадку небольшую в ГЦЦ:
    > Не считает поле "int" в "const union" за "const int".
    > Из-за этого такое поле нельзя вставить в switch/case...
    > Мелочь, а неприятно.
    > Вот например такой код не компилится.
    > http://rextester.com/EOQCD80556
    > Со мной всё в порядке?

    Все правильно:
    www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
    > 6.8,4,2
    > The expression of each case label shall be an integer constant expression and no two of the case constant expressions in the same switch >statement shall have the same value after conversion.

    constant expr != const foo

     
     
  • 3.41, pripolz (?), 16:38, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Приведённая цитата из стандарта не о том. Переводится как "в case должен быть const int, и не допускается два одинаковых const int".

    Вот смотрите. Есть константный union. Помеченный как const, и инициализированный как const. Который прописывается в секцию данных.

    Логично, что все его поля тоже const.

    Но если пытаться инициализировать его полем константу - компилятор ругается..
    И та же ситуация с const struct.

     
     
  • 4.43, Аноним84701 (ok), 16:48, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    >> integer constant expression
    > Приведённая цитата из стандарта не о том. Переводится как "в case должен
    > быть const int, и не допускается два одинаковых const int".

    Вы серьезно или издеваетесь? o_O

    > Вот смотрите. Есть константный union. Помеченный как const, и инициализированный как const.
    > Который прописывается в секцию данных.

    Еще раз: сonst var = только на чтение, но значение может быть присвоенно в рантайм
    сonstant expr = компайлтайм вычисляемое выражение.

     
     
  • 5.44, pripolz (?), 17:01, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –1 +/
    И что в данной ситуации пошло так?
    Почему const union считается constexpr?

    Кстати, если заменить union на struct - тогда ситуация переменная в зависимости от версии компилятора.

     
  • 4.45, dq0s4y71 (ok), 18:07, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Приведённая цитата из стандарта не о том. Переводится как "в case должен быть const int, и не допускается два одинаковых const int".

    О том. Вы почитайте теперь, что, с точки зрения стандарта, есть const int:

    "An integer constant expression99) shall have integer type and shall only have operands that are integer constants, enumeration constants, character constants, sizeof expressions whose results are integer constants, and floating constants that are the immediate operands of casts. Cast operators in an integer constant expression shall only convert arithmetic types to integer types, except as part of an operand to the sizeof operator".

     
     
  • 5.53, pripolz (?), 18:05, 16/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    > Вы почитайте теперь, что, с точки зрения стандарта, есть const int

    Да, всё именно так, спасибо.

     
  • 3.42, pripolz (?), 16:45, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Раскомментируйте "case z":

    https://godbolt.org/g/CAvAzb

     
  • 2.46, Аноним (-), 19:41, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Во-первых, в case, как уже выше сказали, должен быть constant expression. Const-qualified переменная типа union таковым не является до C++11 (у вас gcc 5.1, который по умолчанию компилирует С++03). Во-вторых, запись в один член union и чтение из другого - undefined behavior, которого в принципе не допускается в constant expression. А значит даже в C++11 ваш код не является constant expression (т.е. компилятор обязан рассматривать его как runtime код).
     
     
  • 3.49, pripolz (?), 22:26, 15/08/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > запись в один член union и чтение из другого - undefined behavior

    откуда такие глубокие познания в С++ ?

     
     
  • 4.54, Аноним (-), 18:11, 16/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Из стандарта. [class.union], [basic.life].
     
  • 3.51, pripolz (?), 11:56, 16/08/2017 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > компилятор обязан рассматривать его как
    > runtime код).

    Я извиняюсь, допустил небольшой косяк в коде, описав константу внутри функции (сделав её инициализируемой в рантайме).
    Вот исправленный пример, где она не инициализирована в рантайме:

    https://godbolt.org/g/zxEwSn

    Компилятор clang превращает её в 0x04030201 , т.е. воспринимает как const-expr, а gcc кастит в рантайме.


    П.С. Создал баг на gcc. Закрыли с комментом "it has to be a constant literal".

     
     
  • 4.55, Аноним (-), 18:17, 16/08/2017 [^] [^^] [^^^] [ответить]  
  • +/
    Это не меняет ровным счетом ничего template int N struct foo ... текст свёрнут, показать
     

  • 1.50, Аноним (-), 10:49, 16/08/2017 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    А одобренный D где?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру