Хотя релиз GCC 4.9 вероятнее всего состоится не ранее первой половины 2014 года, ресурс Phoronix проанализировал (http://www.phoronix.com/scan.php?page=news_item&px=MTQ5NjM) наиболее интересные возможности, которые появятся в новой версии популярного компилятора.
Наиболее заметными нововведениями (http://gcc.gnu.org/gcc-4.9/changes.html) в версии GCC 4.9 станут:
- Портирование Undefined Behavior Sanitizer ("UBSAN", -fsanitize=undefined) - анализатор неопределенного поведения, пытающийся обнаруживать во время выполнения программы ситуации, когда поведение программы окажется неопределенным из-за ошибки программиста.- Поддержка Address Sanitizer ("ASAN"), ранее реализованная в GCC 4.8, была улучшена и доработана, наиболее видной доработкой стала поддержка архитектуры ARM в дополнение к x86/x86_64.
- Улучшения, касающиеся языков ADA и Fortran. GNAT теперь использует по умолчанию стандарт ADA 2012, а не ADA 2005. Для Fortran реализована поддержка Fortran 2003 finalization. Внесены улучшения в поддержке Fortran 2008.
- Улучшена поддержка стандарта C++14. Ряд улучшений, касающихся C++11;
- Реализована поддержка процессоров RX100, RX200 и RX600.
- Поддержка чипов Intel Silvermont.
Кроме этого, в состав GCC 4.9 имеют шанс попасть библиотеки (http://www.opennet.me/opennews/art.shtml?num=38075) для поддержки JIT-компиляции средствами GCC, код с поддержкой OpenMP 4.0 (http://www.opennet.me/opennews/art.shtml?num=38110) и реализация технологии параллельного программирования Intel Cilk Plus (http://www.opennet.me/opennews/art.shtml?num=31517).
URL: http://www.phoronix.com/scan.php?page=news_item&px=MTQ5NjM
Новость: http://www.opennet.me/opennews/art.shtml?num=38319
> Undefined Behavior Sanitizer ("UBSAN", -fsanitize=undefined) - анализатор неопределенного поведения, пытающийся обнаруживать во время выполнения программы ситуации, когда поведение программы окажется неопределенным из-за ошибки программиста.Достойный ответ на http://www.opennet.me/opennews/art.shtml?num=38293 (хотя некоторые комментаторы в том обсуждении и придерживались мнения, что компилятор не должен заниматься этими вещами).
Оно в РАНТАЙМЕ это делает. Понимаешь разницу между статическим анализатором и рантайм-проверками?И да, статические проверки лучше делать отдельно - не при сборке, а перед коммитом, например.
> Оно в РАНТАЙМЕ это делает. Понимаешь разницу между статическим анализатором и рантайм-проверками?Склонен полагать, что это все же неточность. Самые опасные UB можно отловить еще на стадии компиляции.
А не нужно полагать. Это не слёт юных Ванг.
Читать чендж-логи надо:
>Various computations will be instrumented to detect undefined behavior at runtime..
Потому что и там, и тут вы путаете анализатор, оптимизатор и собственно компилятор.
Скорее, это _вы_ их путаете. Причем преднамеренно.
От накрутки плюсов и минусов _вы_ умнее не станете.
Очень жаль что до сих пор тратятся силы на поддержку ADA.
Жаль всем, кроме разработчиков ADA
Ну на С++ же тратят, а он гораздо хуже. Почему бы и на Аду не потратить?
> Ну на С++ же тратят, а он гораздо хужеПофиг на объективные достоинства и недостатки, все определяет популярность.
> Пофиг на объективные достоинства и недостатки, все определяет популярность.Ну тогда гaвно вне конкуренции: миллионы мух не могут ошибаться!
мы всё еще о с++?
> мы всё еще о с++?Ну о ком же еще.
> мы всё еще о с++?согласен, «говно» для c++ — слишком мягко и ласково.
> а он гораздо хуже.А где "по моему скромному мнению" или "на мой вкус" (в этом случае это хотя бы не было наглым враньем)?
А оно и так им не является. С++ объективно хуже.
> (в этом случае это хотя бы не было наглым враньем)?а оно и без этого не враньё.
>Очень жаль что до сих пор тратятся силы на поддержку ADA.А что вы тогда скажите про Fortran ? ;)
> А что вы тогда скажите про Fortran ? ;)Что он как язык для математических расчетов до сих пор вне конкуренции?
Ну тогда Ada, по степени надёжности программ на нём, до сих пор вне конкуренции для Пентагоновской военки.
А как же самое значимое нововведение? ЦВЕТНОЙ ВЫВОД СООБЩЕНИЙ ОБ ОШИБКАХ!Включается через -fdiagnostics-color=auto
> А как же самое значимое нововведение? ЦВЕТНОЙ ВЫВОД СООБЩЕНИЙ ОБ ОШИБКАХ!
> Включается через -fdiagnostics-color=autoнаверняка сделают по умолчанию включеным — так же, как и идиотскую каретку. два патча надо будет накладывать.
каретка - супер тема
> наверняка сделают по умолчанию включеным — так же, как и идиoтскую каретку. два патча надо будет накладывать.Зачем, если можно просто пользоваться gcc 4.3.3?
> Зачем, если можно просто пользоваться gcc 4.3.3?Лучше 2.95 сразу :)
2.95 был реактивный по скорости сборки. После него 3-я ветка казалось жутко тормозной.
> 2.95 был реактивный по скорости сборки.- А я могу печатать 1000 знаков в минуту. Правда такая фигня получается...
> наверняка сделают по умолчанию включеным — так же, как и идиотскую каретку.*из танка* а что за каретка??
>> наверняка сделают по умолчанию включеным — так же, как и идиотскую каретку.
> *из танка* а что за каретка??дебильное нововведение в gcc 4.8, упёртое из шланга: выводить кроме места ошибки ещё и строку с ошибкой, а снизу подпирать кареткой.
Да, очень бесит чудаков которые по 20 варнингов сперва наплодят а потом оказывается что теперь мат компилера не влезает на экран.
> Да, очень бесит чудаков которые по 20 варнингов сперва наплодят а потом
> оказывается что теперь мат компилера не влезает на экран.в виде исключения отвечу даже без «ты идиот». видишь ли, визуальный мусор (а строки и каретка являются именно им) затрудняет разбор сообщений компилятора *глазами*. нужно тратить дополнительные усилия для того, чтобы пропускать совершенно бесполезную информацию.
отчего она бесполезная? а потому, что программист или:
а) всё равно пойдёт править код — и тогда строку он увидит в редакторе (вместе с контекстом, что куда как полезней), и курсор обычно редактор поставит куда надо, или
б) править прямо сейчас не будет, и тогда лишняя информация ещё более лишняя.в итоге получается тупое захламление консоли информацией, которая не нужна. в угоду идиотам-хипстерам.
>> наверняка сделают по умолчанию включеным — так же, как и идиотскую каретку.
> *из танка* а что за каретка??dfdfd
Зачем патч? -fno-diagnostics-color -fno-diagnostics-show-caret чем не устраивает?
> Зачем патч? -fno-diagnostics-color -fno-diagnostics-show-caret чем не устраивает?тем, что старые версии gcc на неизвестные «-f» тупо падают, отказывась компилировать что бы то ни было. а я собираю софт не только у себя на технике. поэтому варианты такие: или жестоко впиливать проверку на версию компилятора и добавлять этот флаг в сборочных скриптах по необходимости, или один раз пропатчить gcc, сменив значение на «по умолчанию — выключено». второй вариант мне нравится больше.
>> Зачем патч? -fno-diagnostics-color -fno-diagnostics-show-caret чем не устраивает?
> тем, что старые версии gcc на неизвестные «-f» тупо падают, отказывась компилировать
> что бы то ни было. а я собираю софт не только
> у себя на технике. поэтому варианты такие: или жестоко впиливать проверку
> на версию компилятора и добавлять этот флаг в сборочных скриптах по
> необходимости, или один раз пропатчить gcc, сменив значение на «по умолчанию
> — выключено». второй вариант мне нравится больше.А вариант "один раз прописать в *.specs" не рассматривается?
> А вариант «один раз прописать в *.specs» не рассматривается?нет.
Только что собрал
% pkg info -x gcc
gcc-4.9.0.20131020_1
Минус один тебе, как шлангисту.
А для жабистов ты теперь вообще еретик.
> Только что собралмы все ждали этого сообщения — и дождались, наконец!
изя, собрать программу из исходников подвиг только для тебя. для нормальных людей это обучное действие, о котором не надо гордо сообщать на форумах.
> изя, собрать программу из исходников подвиг
>надо гордо сообщать на форумах."Мы пахали! Язень и пакеж ментейнер."
> Только что собралКруто. И что ты с ним будешь делать? Я не думаю что твоей квалификации хватит тестировать экспериментальный компилер, а компилить пререлизной версией софт... проще в саперы сразу записаться при такой хабрахрабрости :).
Плюс один Вам, как шлангисту.
Пользуйтесь GCC, он хороший.
> Портирование Undefined Behavior Sanitizer ("UBSAN", -fsanitize=undefined) - анализатор неопределенного поведения, пытающийся обнаруживать во время выполнения программы ситуации, когда поведение программы окажется неопределенным из-за ошибки программиста.какого хрена не на стадии компиляции
Дyрак, да?
> Дyрак, да?Нет ты.
> Дyрак, да?таки да. что странно: раньше, вроде, нормальный был.
> какого хрена не на стадии компиляцииПроцессоры шибко быстрыми стали, ресурс их надо чем то нагрузить, очевидно же.
>> какого хрена не на стадии компиляции
> Процессоры шибко быстрыми стали, ресурс их надо чем то нагрузить, очевидно же.Пусть лучше вместо всяких деревьев и хешей вкорячивают несортированные списки, с поиском путем перебора. Нуачо, код становится проще и прозрачнее, а оптимизации - да фиг с ними.
>> какого хрена не на стадии компиляции
> Процессоры шибко быстрыми стали, ресурс их надо чем то нагрузить, очевидно же.Перепись дубов на опеннете объявляется открытой. Так, кто еще выкладки Тюринга из "програмеров" не знает? А ну дописывайся сюда. Дуралеев надо знать в лицо.
> какого хрена не на стадии компиляцииОчень тяжело. Даже бравые парни из PVS-Studio отлавливать ряд undefined behavior проблем не могут. А для компилятора это вообще запредельно.
Ну вон товарищи что-то сваяли... http://css.csail.mit.edu/stack/
В отличие от PVS-Studio - под GPLv3. Впрочем, будем надеяться, что это таки разные подмножества UB.
> Ну вон товарищи что-то сваяли... http://css.csail.mit.edu/stack/
> В отличие от PVS-Studio - под GPLv3. Впрочем, будем надеяться, что это
> таки разные подмножества UB.Возможно. Там была программа, в которой требовался довольно глубокий анализ. Возможно, эти MITшники умеют.
Цитирую свой коммент, который не могу найти:
Программа:
typedef struct SSS
{
int a, b;
} SS;SS * f( SS* ss)
{
ss->a = 2;
return ss;
}int main( int argv, const char ** argc)
{
SS ss;
ss.a = 1;
ss.b = 3;f( &ss)->b = ss.a;
return ss.b;
}8><----------------------------------------------><8
Компиляция:
[vkni@t60 Arisu.clang]$ gcc test.c -o gcc
[vkni@t60 Arisu.clang]$ clang test.c -o clangКак запускать:
[vkni@t60 Arisu.clang]$ ./gcc ; echo $?
2
[vkni@t60 Arisu.clang]$ ./clang ; echo $?
1
Ну, на мой скромный взгляд, gcc тут справился, а clang нет.
2-а вопроса:
1. Какое это имеет отношение к анализаторам, т.к. (повторю, ИМХО) это валидные конструкции с точки зрения языка и ко всяким переполнениям и пр. не имеют отношения?
2. И что про это говорит ПВС? Типа, можно, но осторожно? Или нельзя? Или что?
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.5 Expressions
...
2 Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression.72) Furthermore, the prior value
shall be read only to determine the value to be stored.73)
...73) This paragraph renders undefined statement expressions such as
i=++i + 1;
a[i++] = i;
while allowing
i=i+1;
a[i] = i;
Не в тему вообще.
Зыж
Хотелось бы услышать ответы на вопросы от предыдущего оратора.
А вам читать мануал об области видимости переменных.
Ззыж
>А вам читать мануал об области видимости переменных.Ну о передаче переменных по ссылке.
При чём тут передача переменных по ссылке? Тут интереснее порядок выполнения операций в выражении, что должно быть вычислено раньше - адрес, куда писать результат, или сам результат.
Ещё раз посмотрите пример.
Нет там вычеслений адреса. Есть локальная переменная, маскирующая глобльную, которая передаётся по ссылке в функцию.
Усё.
Если это вы не поняли, то шаблоны, лямбды и вообще обобщённое программирование вам крышу оторвёт.
зыж
>Нет там вычеслений адреса. Есть локальная переменная, маскирующая глобльную, которая передаётся по ссылке в функцию.
>Усё.Если и этот намк не понятен, то можно рассмотреть вот это подробнее:
>f( &ss)->b = ss.a;Ассоциативность справа налево, вызов функции "()" во второй группе приоритетов (прочем как и прямое членство "." и косвенное членство "->"), присваивание "=" аж в шестнадцатой (всего их 18).
Поэтому вначале вызывается функция "f", потом "->" в левой части, потом "." в правой части, потом левой части присваивается "=" значение правой.
зззззззззззззззыж
>Ассоциативность справа налево,Сори, слева направо конечно же. :D
Не в арабских странах C/С++ разрабатывались.
Ага, щас. У присваивания как раз ассоциативность справа налево:
$ cat test.c
#include <stdio.h>
main(){
int a = 1, b = 2, c = 3;
a = b = c;
printf("%d %d %d\n", a, b, c);
}
$ make test
cc test.c -o test
$ ./test
3 3 3
Вот и думай теперь, должен компилятор в примере Vkni сначала разбираться с левоассоциативным выражением в левой части правоассоциативного или в правой. Пример с неопределённостью выражения a[++i]=i тут как раз к месту — всё совершенно аналогично.
>Ага, щас. У присваивания как раз ассоциативность справа налево:Вот только номер его 16, поэтому пусть молчит в тряпочку до своей очереди.
Зыж
Вы так троллите что ли?
>>Ага, щас. У присваивания как раз ассоциативность справа налево:
> Вот только номер его 16, поэтому пусть молчит в тряпочку до своей
> очереди.Угу. Вот только когда эта очередь наступит: сразу после выполнения его левого операнда (как и положено правоассоциативному оператору) или правого (что облегчает труд создателя компилятора)? Стандарт на этот счёт выражается достаточно ясно: undefined.
> Зыж
> Вы так троллите что ли?Нет, ты. Спецификации языка не читал, а специалиста из себя корчишь почему-то.
>Угу. Вот только когда эта очередь наступит:Когда его очередь наступит, все операнды будут определены. И функции посчитаны.
Для отстающих — в ss.а будет 2.
>Нет, ты. Спецификации языка не читал, а специалиста из себя корчишь почему-то.1. Не ты, а вы.
2. С я ещё в 90-х преподавал. И вы бы точно сессию провалили.
> 2. С я ещё в 90-х преподавал. И вы бы точно сессию
> провалили.судя по всему, у тебя и Керниган с Ричи провалили бы.
судя по всему, ты очень хотел хоть что-нибудь сказать, но так ничего и не придумал.
я сказал именно то, что хотел сказать, и именно так, как хотел сказать. но я не удивлён, что ты не понял.
почему же, понял отлично — передёргивание и флэйм, это единственное что ты умеешь.
> почему же, понял отлично — передёргивание и флэйм, это единственное что ты
> умеешь.продолжай демонстрировать непонимание, у тебя хорошо получается.
Я, конечно, стар стал, подслеповат, но глобальную переменную там в упор не вижу - есть локальная для main и есть параметр дл f и, соответственно, ничего нигде не маскирует. Налицо именно UB согласно вышеприведенному пункту.
>Я, конечно, стар стал, подслеповат, но глобальную переменную там в упор не вижуА кто говорил, что о6а есть?
Зыж
А методы то молоденького бычк... трольчика.
1. Это в чистом виде undefined behavior, просто несколько другого типа.Поэтому, кстати, оба компилятора облажались - никто не выдал предупреждения.
2. PVS 5.10 на этой программе тоже ничего не выдаёт.
Стандарт языка С говорит, что нельзя - см. предыдущего оратора.
>1. Это в чистом виде undefined behavior, просто несколько другого типа.Тогда будьте любезны, поясните в каком месте.
>2. PVS 5.10 на этой программе тоже ничего не выдаёт.И правильно делает.
Ибо ваш пункт 1 — полная ахинея.
Переменная вполне себе defined.
И ссылка на неё соответсвенно тоже.
> Тогда будьте любезны, поясните в каком месте.Результат зависит от порядка вычисления выражений по разные стороны равенства.
Разработчики стандартов языков С и С++ специально сделали это undefined behavior для того, чтобы в случаях, когда этот порядок не влияет на результат, можно было бы выбрать максимально быстрый порядок.
> И правильно делает.
Вы не поверите, но даже разработчики PVS с вами не согласны.
Я от вас хотел бы услышать аргументы, а не лозунги. Свои я уже приводил тут http://www.opennet.me/openforum/vsluhforumID3/92430.html#55 Могу повторить более подробно. Берём первый попавшийся учебник, например «Язык программирования С++», Стивен Прата, ISBN 978-5-8459-1778-2. (Стандарт С++ дополнительно приводит ANSI C, если что. Там же, стр. 40) Стр. 1119:
>Если две операции применены к одному и тому же аргументу, то первой будет выполнена операция, имеющая более высокий уровень приоритета. Если две операции имеют одинаковый уровень приоритета, то для выполнения первоочерёдности С++ руководствуется правилами ассоциации. Все операции в одной группе имеют одинаковый уровень приоритета и одинаковую ассоциативность.Ещё раз, «в одной группе имеют одинаковый уровень приоритета и одинаковую ассоциативность». Смотрим ваш пример. Всё выражение состоит только из операций 2-ой и 16-ой групп. 2-я группа имеет ассоциативность слева направо и выполняется первой.
зыж
>Разработчики стандартов языков С и С++ специально сделали это undefined behaviorБред. Ахинея и Еритизм. :D
Ваш пример даже не требует последних стандартов и работать должен минимум на компиляторах 15-и летней давности. В общем пруф на стандарт или не было.
ззыж
>Вы не поверите, но даже разработчики PVS с вами не согласны.Опять же, пруф. И я смело смогу на всех семинарах говорить какого уровня специалисты работают даже в таких, серьёзных организациях.
> Я от вас хотел бы услышать аргументы, а не лозунги.Играть в социальные игры с анонимными людьми - это идиотизм. Вы своим псевдоанонимным ником показываете, что желали бы подписываться Аноним, поэтому с вами общаться как с отдельной личностью тоже неправильно. Только в рамках вопрос - ответ.
> Если две операции применены к одному и тому же аргументу, то первой будет выполнена операция, имеющая более высокий уровень приоритета. Если две операции имеют одинаковый уровень приоритета, то для выполнения первоочерёдности С++ руководствуется правилами ассоциации. Все операции в одной группе имеют одинаковый уровень приоритета и одинаковую ассоциативность.
Стандарт языка С, последняя версия черновика http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
"The side effect of updating the stored value of the left operand is
sequenced after the value computations of the left and right operands. The evaluations of
the operands are unsequenced." - страница 101, последний абзац.Там же, дополнение J.1 (Unspecified behavior), страница 555, пятый пункт сверху
"The order in which the operands of an assignment operator are evaluated (6.5.16)."
Т.е. чётко и недвусмысленно написано, что стандарт не определяет (unspecified) порядок, в котором вычисляются операнды оператора присвоения.
Ещё раз, чтобы у остальных посетителей форума не формировались ложные понятия.
Вот это:
>Результат зависит от порядка вычисления выражений по разные стороны равенства.Разработчики стандартов языков С и С++ специально сделали это undefined behaviorложь.
Операция присваивания "=" находится в 16 группе приоритетов, которая имеет ассоциативность справа налево и отличается от других операций только этим и ничем более.
В пункте 2 параграфа 6.5 стандарта ISO/IEC 9899:1999 написано следующее:Between the previous and next sequence point an object shall have its stored value
modified at most once by the evaluation of an expression. Furthermore, the prior value
shall be read only to determine the value to be stored.Между предыдущей и следующей точкой следования объект должен иметь свое сохраненное значение изменённым не более одного раза в ходе вычисления выражения. Кроме того, предыдущее значение должно быть прочтено только для определения значения для сохранения.
Порядок выполнения тут не важен сам по себе. Компилятор ожидает, что программа соблюдает стандарт, и исходя из этого генерирует машинные инструкции.
В черновике стандарта ISO/IEC 9899:201x этот пункт выглядит иначе:
If a side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar
object, the behavior is undefined. If there are multiple allowable orderings of the subexpressions of an expression, the behavior is undefined if such an unsequenced side
effect occurs in any of the orderings.Если допускается более одного порядка вычисления выражения, то поведение не определено. Если вы считаете, что порядок выполнения операторов в указанных выше примерах однозначен, то дайте ссылку на соответствующий пункт или пункты в стандарте, а не в учебнике.
И, если ссылаетесь на группы приоритетов, было бы здорово увидеть ссылку на пункт или пункты стандарта, где эти группы определены.
Вы, конечно, извините, но мне кажется, что Вам необходимо взять паузу и хорошо всё обдумать. И ассоциативность тут вообще не в тему. Вы сказали, что что-то преподаете? М-м-м... Успокойтесь и просто подумайте в спокойной обстановке.