The OpenNET Project / Index page

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



"Выпуск набора компиляторов GCC 7.2"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от opennews (??) on 15-Авг-17, 00:39 
Доступен (https://gcc.gnu.org/ml/gcc-announce/2017/msg00002.html) корректирующий релиз набора компиляторов GCC 7.2 (https://gcc.gnu.org/gcc-7/), в котором проведена работа по исправлению ошибок, регрессивных изменений и проблем с совместимостью. По сравнению с версией GCC 7.1 (https://www.opennet.ru/opennews/art.shtml?num=46487) в GCC 7.2 отмечено  95 исправлений (https://gcc.gnu.org/gcc-7/changes.html), в основном связанных с устранением регрессивных изменений. Напомним, что начиная с ветки GCC 5.x в проекте внедрена новая схема нумерации выпусков: версия x.0 используется в процессе разработки, корректирующие выпуски формируются с номерами x.2.0, x.3.0 и т.д. Новые возможности развиваются в экспериментальной ветке GCC 8.0, на базе которой будет сформирован следующий значительный релиз GCC 8.1.


URL: https://gcc.gnu.org/ml/gcc-announce/2017/msg00002.html
Новость: https://www.opennet.ru/opennews/art.shtml?num=47021

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


2. "Выпуск набора компиляторов GCC 7.2"  –14 +/
Сообщение от Аноним (??) on 15-Авг-17, 00:40 
А позор типа
for (int n = 0; n < arr_length; ++n) make_zashibis(arr[n]);
...
if (arr) { ... } /* выкинуто gcc по причине undefined behaivour */

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Выпуск набора компиляторов GCC 7.2"  +12 +/
Сообщение от Аноним (??) on 15-Авг-17, 00:46 
Выкинуть нужно анонима. А gcc всё сделал правильно
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору
Часть нити удалена модератором

7. "Выпуск набора компиляторов GCC 7.2"  +2 +/
Сообщение от Crazy Alex (ok) on 15-Авг-17, 01:36 
Ты полный пример можешь дать? И версию компилятора заодно...

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

Ответить | Правка | Наверх | Cообщить модератору

9. "Выпуск набора компиляторов GCC 7.2"  –3 +/
Сообщение от Аноним (??) on 15-Авг-17, 01:58 
GCC6.3 и старая opera , моя прелесть
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

12. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от Ordu email(ok) on 15-Авг-17, 04:03 
Это просто сотрясения воздуха, а не ответ на вопрос.

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

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 синтаксис. Но суть видна и так.

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

18. "Выпуск набора компиляторов GCC 7.2"  –3 +/
Сообщение от Другойаноним on 15-Авг-17, 09:45 
Тем не менее,было такое дело , было  https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49820
Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

28. "Выпуск набора компиляторов GCC 7.2"  +1 +/
Сообщение от pripolz on 15-Авг-17, 12:16 
так та бага вообще не о том.
Там юзер хотел "проверить int на переполнение". Ему и объяснили, что это UB.
Ответить | Правка | ^ к родителю #18 | Наверх | Cообщить модератору

27. "Выпуск набора компиляторов GCC 7.2"  –1 +/
Сообщение от Iaaa (ok) on 15-Авг-17, 12:16 
Можно было просто дать ссылку https://godbolt.org/g/Wy4TPn
И нагляднее, и проще.
Ответить | Правка | ^ к родителю #12 | Наверх | Cообщить модератору

29. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от Аноним (??) on 15-Авг-17, 13:08 
То есть ты сначала разыменовываешь указатель, а потом проверяешь, не нулевой ли он? Молодец, чё.
Ответить | Правка | Наверх | Cообщить модератору

52. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от УЖАС СОВКА on 16-Авг-17, 12:57 
А в чем проблема ?? Если N<0, он и не разименовывается.
Ответить | Правка | ^ к родителю #29 | Наверх | Cообщить модератору

8. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от asdasdasd on 15-Авг-17, 01:56 
Вы сами написали: "/* выкинуто gcc по причине undefined behaivour */".
Неопределенное поведение потому оным и зовется, что оно неопределенное и в стандарте не прописано.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору
Часть нити удалена модератором

11. "Выпуск набора компиляторов GCC 7.2"  +8 +/
Сообщение от Crazy Alex (ok) on 15-Авг-17, 03:07 
Не, нормальные люди не допускают UB. Хотя выше пример исковеркан - к примеру, там, вероятно, if (!arr) имелось в виду. И навреняка ещё куча всего покалечена, так что не понять. Где там те исходники оперы ловить - не знаю и разбираться не хочу. Охота возиться с варезом - флаг в руки. Или ещё куда.
Ответить | Правка | Наверх | Cообщить модератору

17. "Выпуск набора компиляторов GCC 7.2"  –3 +/
Сообщение от Аноним (??) on 15-Авг-17, 09:28 
ИМХО UB должно не компилироваться или компилироваться, но не выкидываться, т.к. это уже UB^2 ( но это лишь моё мнение основанное не на тоннах непонятного кода а на аналогией с жизнью в реальном мире и правилах по технике безопасности, хотя последнее время читая посты про вживление ИТ мира в реальность складывается впечатления что они слишком ортогональны )
Ответить | Правка | ^ к родителю #11 | Наверх | Cообщить модератору

24. "Выпуск набора компиляторов GCC 7.2"  +2 +/
Сообщение от anonymous (??) on 15-Авг-17, 11:16 
Вообще-то, в стандарте С как раз описано неопределённое поведение.
Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

16. "Выпуск набора компиляторов GCC 7.2"  +2 +/
Сообщение от Аноним (??) on 15-Авг-17, 09:15 
Используй clang, какие проблемы то?
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

22. "Выпуск набора компиляторов GCC 7.2"  +1 +/
Сообщение от Comdiv (ok) on 15-Авг-17, 11:08 
Да, это ошибка компилятора, но что тут позорного? Хорошую оптимизацию сделать сложно, а при создании сложных вещей легче ошибиться, чем при создании "Hello, world". Поэтому когда программист включает оптимизацию, он должен понимать, что делает. Также он должен понимать, что люди ошибаются, кроме него самого, разумеется.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

31. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от freehck email(ok) on 15-Авг-17, 14:44 
> GNU-макаки исправили или нет ??

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

35. "Выпуск набора компиляторов GCC 7.2"  –1 +/
Сообщение от Ан (??) on 15-Авг-17, 15:42 
> Нецензурщину в треде вырезал.

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

Ответить | Правка | ^ к родителю #31 | Наверх | Cообщить модератору

48. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от УЖАС СОВКА on 15-Авг-17, 20:13 
В общем, на сей случай есть набор ключей,который придется теперь писать везде
-fno-strict-aliasing
-fno-strict-overflow
-fwrapv
-fno-delete-null-pointer-checks
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

13. "Выпуск набора компиляторов GCC 7.2"  +8 +/
Сообщение от Аноним (??) on 15-Авг-17, 04:57 
Диванные хаятели gcc в треде! все в машину!

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

14. "Выпуск набора компиляторов GCC 7.2"  +1 +/
Сообщение от Аноним (??) on 15-Авг-17, 08:01 
Чаще всего все глюки из-за оптимизации. И они действительно есть. Один очень хорошо повторялся: strlen на пустой строке сегфолтился по выходу за пределы строки (\0 точно был). Возможно неверно запомнил, но поведение примерно такое было. Не хочется глюков, -O0. Вот и всё.
Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

15. "Выпуск набора компиляторов GCC 7.2"  +2 +/
Сообщение от Аноним email(??) on 15-Авг-17, 09:14 
Если бы не gcc - где бы час находился бы наш мир!!
А гляки/баги есть везде!(в оприори) - где то больше где то меньше, но это не важно для ядерной станции....

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

34. "Выпуск набора компиляторов GCC 7.2"  –1 +/
Сообщение от Аноним (??) on 15-Авг-17, 15:15 
Он был бы несомненно лучше и удобнее
Ответить | Правка | ^ к родителю #15 | Наверх | Cообщить модератору

32. "Выпуск набора компиляторов GCC 7.2"  –1 +/
Сообщение от Аноним (??) on 15-Авг-17, 14:53 
Учитывая, что я лично нашёл не менее 5 примёров, когда GCC генерировал плохой код, то даже не знаю.

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

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

// b.

Ответить | Правка | ^ к родителю #13 | Наверх | Cообщить модератору

47. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от llolik (ok) on 15-Авг-17, 20:06 
> Впрочем, с другими компиляторами так тесно не общался, и могу предположить

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

Ответить | Правка | ^ к родителю #32 | Наверх | Cообщить модератору

36. "Выпуск набора компиляторов GCC 7.2"  –1 +/
Сообщение от pripolz on 15-Авг-17, 15:48 
Наткнулся на такую засадку небольшую в ГЦЦ:
Не считает поле "int" в "const union" за "const int".

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

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

http://rextester.com/EOQCD80556

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

37. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от pripolz on 15-Авг-17, 15:55 
> Не считает поле "int" в "const union" за "const int".

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

Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

38. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от pripolz on 15-Авг-17, 16:03 
> скорее всего собирает этот const union в рантайме

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

https://godbolt.org/g/P15iqG

Ответить | Правка | ^ к родителю #37 | Наверх | Cообщить модератору

39. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от pripolz on 15-Авг-17, 16:10 
Вообще ни один компилер не компилит.

https://godbolt.org/g/RhZjwA

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

Ответить | Правка | ^ к родителю #38 | Наверх | Cообщить модератору

40. "Выпуск набора компиляторов GCC 7.2"  +1 +/
Сообщение от Аноним84701 (ok) on 15-Авг-17, 16:17 
> Наткнулся на такую засадку небольшую в ГЦЦ:
> Не считает поле "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

Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

41. "Выпуск набора компиляторов GCC 7.2"  –1 +/
Сообщение от pripolz on 15-Авг-17, 16:38 
Приведённая цитата из стандарта не о том. Переводится как "в case должен быть const int, и не допускается два одинаковых const int".

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

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

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

Ответить | Правка | ^ к родителю #40 | Наверх | Cообщить модератору

43. "Выпуск набора компиляторов GCC 7.2"  +1 +/
Сообщение от Аноним84701 (ok) on 15-Авг-17, 16:48 
>> integer constant expression
> Приведённая цитата из стандарта не о том. Переводится как "в case должен
> быть const int, и не допускается два одинаковых const int".

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

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

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

Ответить | Правка | ^ к родителю #41 | Наверх | Cообщить модератору

44. "Выпуск набора компиляторов GCC 7.2"  –1 +/
Сообщение от pripolz on 15-Авг-17, 17:01 
И что в данной ситуации пошло так?
Почему const union считается constexpr?

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

Ответить | Правка | ^ к родителю #43 | Наверх | Cообщить модератору

45. "Выпуск набора компиляторов GCC 7.2"  +1 +/
Сообщение от dq0s4y71 (ok) on 15-Авг-17, 18:07 
> Приведённая цитата из стандарта не о том. Переводится как "в 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".

Ответить | Правка | ^ к родителю #41 | Наверх | Cообщить модератору

53. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от pripolz on 16-Авг-17, 18:05 
> Вы почитайте теперь, что, с точки зрения стандарта, есть const int

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

Ответить | Правка | ^ к родителю #45 | Наверх | Cообщить модератору

42. "Выпуск набора компиляторов GCC 7.2"  –2 +/
Сообщение от pripolz on 15-Авг-17, 16:45 
Раскомментируйте "case z":

https://godbolt.org/g/CAvAzb

Ответить | Правка | ^ к родителю #40 | Наверх | Cообщить модератору

46. "Выпуск набора компиляторов GCC 7.2"  +2 +/
Сообщение от Аноним (??) on 15-Авг-17, 19:41 
Во-первых, в case, как уже выше сказали, должен быть constant expression. Const-qualified переменная типа union таковым не является до C++11 (у вас gcc 5.1, который по умолчанию компилирует С++03). Во-вторых, запись в один член union и чтение из другого - undefined behavior, которого в принципе не допускается в constant expression. А значит даже в C++11 ваш код не является constant expression (т.е. компилятор обязан рассматривать его как runtime код).
Ответить | Правка | ^ к родителю #36 | Наверх | Cообщить модератору

49. "Выпуск набора компиляторов GCC 7.2"  –2 +/
Сообщение от pripolz email on 15-Авг-17, 22:26 
> запись в один член union и чтение из другого - undefined behavior

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

Ответить | Правка | ^ к родителю #46 | Наверх | Cообщить модератору

54. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от Аноним (??) on 16-Авг-17, 18:11 
Из стандарта. [class.union], [basic.life].
Ответить | Правка | ^ к родителю #49 | Наверх | Cообщить модератору

51. "Выпуск набора компиляторов GCC 7.2"  –2 +/
Сообщение от pripolz on 16-Авг-17, 11:56 
> компилятор обязан рассматривать его как
> runtime код).

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

https://godbolt.org/g/zxEwSn

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


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

Ответить | Правка | ^ к родителю #46 | Наверх | Cообщить модератору

55. "Выпуск набора компиляторов GCC 7.2"  +/
Сообщение от Аноним (??) on 16-Авг-17, 18:17 
>> компилятор обязан рассматривать его как
>> runtime код).
> Я извиняюсь, допустил небольшой косяк в коде, описав константу внутри функции (сделав
> её инициализируемой в рантайме).
> Вот исправленный пример, где она не инициализирована в рантайме:
> https://godbolt.org/g/zxEwSn

Это не меняет ровным счетом ничего.

    template< int N >
    struct foo
    {
        static const int value = N;
    };

    enum { constant = 10 };

    int main()
    {
        const int n = constant;
        return foo< n >::value;
    }

Это собирается и возвращает 10. Это демонстрирует, что n - это constant expression.

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

Нет, вы путаете constant expression со способностью компилятора к оптимизациям.

Ответить | Правка | ^ к родителю #51 | Наверх | Cообщить модератору

50. "Выпуск набора компиляторов GCC 7.2"  –1 +/
Сообщение от Аноним (??) on 16-Авг-17, 10:49 
А одобренный D где?
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

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