LINUX.ORG.RU

Опубликован новый стандарт языка C: C11

 , ,


0

8

Международная Огранизация по Стандартизации (ISO) опубликовала новый международный стандарт языка программирования C: ISO/IEC 9899:2011, ранее известный как C1X. Основные изменения:

  • поддержка многопоточности;
  • улучшенная поддержка юникода;
  • обобщенные макросы (type-generic expressions, позволяют статичную перегрузку);
  • анонимные структуры и объединения (упрощают обращение ко вложенным конструкциям);
  • управление выравниванием объектов;
  • статичные утверждения (static assertions);
  • удаление опасной функции gets (в пользу безопасной gets_s);
  • функция quick_exit;
  • спецификатор функции _Noreturn;
  • новый режим эксклюзивного открытия файла.

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

Некоторые возможности нового стандарта уже поддерживаются компиляторами GCC и Clang. Стоит, однако, отметить, что полной поддержки предыдущего стандарта C99 в этих и большинстве других компиляторов нет.

Последний черновик стандарта

>>> Подробности

★★★★

Проверено: Shaman007 ()
Последнее исправление: unsigned (всего исправлений: 4)
Ответ на: комментарий от arsi

следующий код опасен.

и чем же он опасен? покусает? изнасилует?

размышления сишников о кодобезопасности :D

chinarulezzz ★★
()

Вот это новость! Здравый подарок к новому году

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

Говнокодер детектед

Вместо

sprintf(copy_buff,«MSG: %s\n»,vuln_array);

используй

snprintf(copy_buff,sizeof(copy_buff),«MSG: %s\n»,vuln_array);

Вывод: ты говнокодер и тролль. У тебя, какой язык ты ни используй, всё равно небезопасное говно получится.

anonymous
()
Ответ на: Говнокодер детектед от anonymous

если я напишу потом что и функция snprintf небезопасна и приведу код - анонимное трололо успокоется?)) Стандартный аргумент сишных защитников: плох не язык, плохи программисты. Доля правды в этом есть, но объективно, С - гамно)

И всё, аноним, от тебя тоже толку нету) За сим откланяюсь и отвечать на твои высеры не буду)

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

И какое отношение эта проблема имеет к strncpy? sprintf нормальные люди тоже не используют, как ты можешь догадаться.

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

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

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

strncpy опасна

code says: sprintf

Браво, так толсто вбрасывать и не стыдиться собственной невежественности. Это же надо быть полным профаном.

Кстати, на будущее: научись не пропускать важдные хидеры с объявлением прототипов или используй -Werror-implicit-function-declaration. С большой долей уверенности можно сказать, что такие приемы программирования существенно снизят «опасность» твоего кода.

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

Кстати, на будущее: научись не пропускать важдные хидеры с объявлением прототипов или используй -Werror-implicit-function-declaration. С большой долей уверенности можно сказать, что такие приемы программирования существенно снизят «опасность» твоего кода.

Ты ему забыл дать главный совет: не программируй, не надо.

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

но объективно, С - гамно

«У-у-у-у, как всё запущено...» (c) И этот человек обзывал меня «тупым троллем»?!!! ;)

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

Основные важнейшие ОС, подсистемы и системный софт всё равно пока пишутся на Си, ни у кого нет нерешаемых проблем, каких-то неадекватных поведений си-кода тоже не наблюдается. Си по сути является пропуском в тонкий мир взаимодействия с ОС, где многое может привести к краху системы. Этот мир можно разрабатывать только таким же «опасным» инструментом как Си. Использование языка, где всё предусмотрено для защиты от дурака так или иначе будет бессмысленным и вредным, с учётом того, что сейчас почти нет соответствующих таким инструментам систем и теории под это не написано.

Набор функций c добавлением n (sNprintf, strNcpy и т.д.) действительно позволяет не встречаться с глупыми ошибками. Писать можно быстро и эффективно, обычно тормозящим фактором ощущается только недостаточно понимание разработки алгоритма, но никак не язык, к языку претензий никаких - язык на самом деле красивейший и никуда не денется. Почти любую мультимедийную Android-программу всё равно приходится «доделывать» через JNI. Скорости в современных системах сильно не хватает и Си/Ассемблер ещё очень рано списывать.

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

Си по сути является пропуском в тонкий мир взаимодействия с ОС, где многое может привести к краху системы. Этот мир можно разрабатывать только таким же «опасным» инструментом как Си.

Куча народа работает над тем, чтобы пафосная глупость подобных высказываний стала очевидной всем (она и сейчас очевидна, но еще не всем).

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

Ой, да ладно! Эта «куча народу» якобы «работает» уже 40 лет - еще дедушка Вирт в очень язвительной форме высказывался против Си уже через пару лет после создания языка. А воз и ныне там: http://osrc.blackducksoftware.com/data/projects/#languageos

Открытый язык без барьеров так называемого «защитного программирования» нужен будет всегда. И вот это как раз очевидно. А «защита от дурака», как следует из названия, только им и нужна.

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

Ой, да ладно! Эта «куча народу» якобы «работает» уже 40 лет

Не пори чушь, ей больно.

еще дедушка Вирт в очень язвительной форме высказывался против Си уже через пару лет после создания языка

Внезапно, эволюция ЯП не остановилась на Паскале (и на Обероне-2 тоже).

Открытый язык без барьеров так называемого «защитного программирования» нужен будет всегда.

Заявление настолько же эффектное, насколько и пустое.

«защита от дурака», как следует из названия, только им и нужна.

Мачо-программист ITT.

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

браво!

для несогласников: не стОит забывать о том, что кодить используя «прослойки» типа C#/python/java, не_всегда_возможно/не_всегда_нужно/не_всегда_эффективно, и главное, помнить то, что эти ЯП создавались в первую очередь именно как защита от дурака. дабы системы не рушились из-за кривых кодеров.

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

собственно, ссылка, подтверждает нужность сего дела.

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

пафосная глупость

в чем же пафосность проявляется? все найденные мною статистики по использованию ЯП, подтверждают популярность/нужность Си. правда кол-во стартапов на Си в этом году снизилось на два процента по сравнению с прошлым. но для стартапов, 1 год - не показатель.

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

в чем же пафосность проявляется?

В стиле высказывания: «пропуск», «тонкий мир», «только 'опасным' инструментом».

все найденные мною статистики по использованию ЯП, подтверждают популярность/нужность Си

Эх. Ну почему в этом топике высказываются либо малоквалифицированные тролли типа chinarulezz, либо вьюноши бледные типа Grid_Sergey? Си необходим, популярен, его нише ничто не угрожает. Но при этом Си гораздо опаснее и сложнее в использовании, чем следует быть современному языку системного программирования.

Тем, кто считает Си вершиной эволюции, следовало бы повнимательнее посмотреть на современные ядра: BSD, Linux, Windows. Из них на чистом ANSI C написаны, AFAIK, только наименее продвинутые и используемые BSD. Windows и Linux используют расширенные диалекты (в Windows есть SEH, Linux использует килограммы GNU-расширений и sparse).

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

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

Сложнее? А что можно упростить? Опаснее? А что поделать, если язык системного программирования должен предоставлять возможность стрелять в ногу при необходимости?

в Windows есть SEH

Мосье подменяет понятия языка и механизмов конкретной операционной системы?

Из них на чистом ANSI C написаны, AFAIK, только наименее продвинутые и используемые BSD

А что мосье называет «чистым ANSI C»? #define _GNU_SOURCE и #include <linux/someshit.h> еще считаются за чистый C?

Linux использует килограммы GNU-расширений и sparse

Что примечательно, «килограммы расширений» — это гнутые ассемблерные вставки, packed/aligned/printf/scanf атрибуты и гнутые расширения, облегчающие написание макросов. Кстати, к 2012 году выравнивание наконец-то затащили в стандарт.

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

В стиле высказывания: «пропуск», «тонкий мир», «только 'опасным' инструментом»

ну.. в общем-то я не с порю с формулировкой....но да, соглашусь, что-то в ней есть не доброе. но возможно не со зла? ;)

почему в этом топике высказываются либо малоквалифицированные тролли типа chinarulezz, либо вьюноши бледные типа Grid_Sergey?

не добрый намек, какой-то.

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

возможно, из-за того что выбирать-то особо не из чего?

niXman ★★★
()

А какой смысл всей этой деятельности? «C» создалавлся как простой и лаконичный язык программирования. Во что его превращают?

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

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

Си дает возможность выстрелить в ногу даже тогда, когда в этом нет необходимости..

в Windows есть SEH

Мосье подменяет понятия языка и механизмов конкретной операционной системы?

Не пытайся умничать, у тебя не получается. Си, на котором написано ядро венды, расширен конструкцией try-except-finally. Так что нет, я ничего не путаю.

А что мосье называет «чистым ANSI C»?

Если ты этого не понимаешь, у тебя проблемы.

Что примечательно, «килограммы расширений» — это гнутые ассемблерные вставки, packed/aligned/printf/scanf атрибуты и гнутые расширения, облегчающие написание макросов.

И? Это расширения.

Кстати, к 2012 году выравнивание наконец-то затащили в стандарт.

Где в стандарте __typeof__ и ({?

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

что-то в ней есть не доброе. но возможно не со зла? ;)

Не со зла, конечно. От восторженности, но это всё равно глупость в пафосной^Wвысокопарной формулировке.

из-за того что выбирать-то особо не из чего?

Поэтому я и говорю «работа идет». Впрочем, sparse есть уже сегодня, и другие верификаторы тоже.

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

Си дает возможность выстрелить в ногу даже тогда, когда в этом нет необходимости..

Лично я нахожу это нормальным, потому что стрелять в ногу может понадобиться в самых неожиданных местах.

Си, на котором написано ядро венды, расширен конструкцией try-except-finally. Так что нет, я ничего не путаю.

Путаешь. Для такой конструкции есть специальная поддержка в runtime-библиотеке и, судя по всему, в самой ОС. Зачем тащить в переносимый язык механизмы, для реализации которых нужна специальная поддержка со стороны операционной системы?

Если ты этого не понимаешь, у тебя проблемы.

Так в какой момент для тебя C становится грязным? После использования __attribute__ или asprintf?

И? Это расширения.

Это я к тому, что ты опять-таки очень любишь сравнивать несравнимое: исключения с «синтаксическим сахаром» (printf/scanf/noreturn атрибуты, гнутые макрорасширения) и подсказками для кодогенерации (aligned и packed). Я лично не понимаю, почему бы packed не затащить в стандарт, но также отлично понимаю, что исключения туда тащить не стоит.

Где в стандарте __typeof__ и ({?

Развития языка не останавливается на 2011 годе. Еще успеют много всякой бяки в стандарт затащить.

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

Си, на котором написано ядро венды, расширен конструкцией try-except-finally. Так что нет, я ничего не путаю.

Путаешь

Как скажешь.

Это я к тому, что ты опять-таки очень любишь сравнивать несравнимое: исключения с «синтаксическим сахаром» (printf/scanf/noreturn атрибуты, гнутые макрорасширения) и подсказками для кодогенерации (aligned и packed)

packed/alignof и прочее приплел ты, не я. И да, это расширения. Так же, как __typeof__ и ({

Развития языка не останавливается на 2011 годе. Еще успеют много всякой бяки в стандарт затащить.

А пока распрстраненные ОС используют расширения языка.

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

packed/alignof и прочее приплел ты, не я.

Ты упомянул, что и в виндовом. и в линуксовом ядрах используются расширения. Я указал на то, что используемые расширения сильно различаются по своей сути.

А пока распрстраненные ОС используют расширения языка.

И, думаю, будут их использовать. Хотя посмотрим, может в скором времени появится коммит, правящий __attribute__((aligned(*))) на синтаксис нового стандарта.

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

Ты упомянул, что и в виндовом. и в линуксовом ядрах используются расширения.

Только вот я не о __attribute__ говорил, а о __typeof__ и ({. И о sparse. Но ты как-то игнорируешь это. Не понимаешь, очевидно.

Я указал на то, что используемые расширения сильно различаются по своей сути.

Использование расширений намекает на то, что возможностей Си не хватает для написания современной ОС.

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

Использование расширений намекает на то, что возможностей Си не хватает для написания современной ОС.

Бред. Возможностей хватает, просто эти расширения ОБЛЕГЧАЮТ написание. Без них тоже можно было сделать. Просто незачем изобретать велосипед, если разработчики компилятора уже позаботились об удобном мотоцикле.

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

Использование расширений намекает на то, что возможностей Си не хватает для написания современной ОС.

Бред. Возможностей хватает, просто эти расширения ОБЛЕГЧАЮТ написание. Без них тоже можно было сделать

Я знал, что рельные знатоки придут и скажут «и без них можно» %) Специально для вас я упомянул BSD.

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

Использование расширений намекает на то, что возможностей Си не хватает для написания современной ОС.

Естественно не хватает. А тебе что, хочется великой и могучей функции boot_and_initialize_kernel() в стандарте?

Только вот я не о __attribute__ говорил, а о __typeof__ и ({

Значит не посчитали эти конструкции широко необходимыми. Без выравнивания и TLS в 2011 уже как-то неуютно, а statement expressions не так уж и широко употребляются. С __typeof__ автоматически возникает проблема конфликта имен, которую пока непонятно как решать. Сишка вроде тем и отличается от прочих языков, что всякую сомнительность в стандарт не тянут.

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

тебе что, хочется великой и могучей функции boot_and_initialize_kernel() в стандарте?

Нет. Но ход твоих мыслей довольно забавен.

statement expressions не так уж и широко употребляются

«Зелен виноград» (с)

С __typeof__ автоматически возникает проблема конфликта имен, которую пока непонятно как решать

Доо, это гигантская проблема.

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

Я знал, что рельные знатоки придут и скажут «и без них можно» %) Специально для вас я упомянул BSD.

Проблема BSD не в языке программирования и игнорировании нестандартных расширений. Я бы сказал, проблема в количестве и активности разработчиков, в том числе во вливании денег в разработку. Просто по сумме этих параметров BSD проигрывает линуксу. Язык тут не при чём.

anonymous
()

Тот редкий случай, когда фраза «Тихо и незаметно...» была бы уместна.

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

просто эти расширения ОБЛЕГЧАЮТ написание

А Си всего лишь облегчает написание по сравнение с ассемблером. Из чего можно сделать вывод, что ОС можно (нужно?) писать на нем, а Си НИНУЖЕН.
И нет, я не передергиваю. Тот же try-except-finally в Си это даже большее повышение уровня абстракции, чем переход от ассемблера к Си.

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

У Си есть один большой плюс по сравнению с ассемблером: грамотно написанный на Си код компилируется под все архитектуры процессоров и прочее, для которых есть компилятор, поддерживающий используемый стандарт Си. Ассемблер же сильно зависит от архитектуры процессора. В случае ассемблера всё прийдётся переписывать заново в случае смены архитектуры.

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

У Си есть один большой плюс по сравнению с ассемблером

То же самое можно сказать про явку и паскалик, тока они еще повыше уровнем будут.

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

В случае ассемблера всё прийдётся переписывать заново в случае смены архитектуры.

Ну вот популярной ОС Виндоус от корпорации Микрософт это вообще оказалось не нужно - она почему-то до сих пор работает только на x86 и вполне себе здравствует. А вот GNU Assembler вообще может транслировать код под много архитектур. И что? Не надо недооценивать мощь высокоуровневых конструкций. Сишка - слишком низкий уровень для СОВРЕМЕННЫХ ОС.

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

Ну вот популярной ОС Виндоус от корпорации Микрософт это вообще оказалось не нужно - она почему-то до сих пор работает только на x86 и вполне себе здравствует.

Какое кол-во архитектур поддерживало NT4? Win2000? Сколько поддерживает Win8?

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

Сишка - слишком низкий уровень для СОВРЕМЕННЫХ ОС.

Это для каких? *BSD, Linux, Solaris, Windows - все написаны на C.

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

...но в продакшене крутится столько систем 40 летней давности...

Я видел одно из этих УГ (в банке оператор показала скрин какой-то уёбищной gtk-поделки, через которую они всё делают). Распечатали мне форму на 5 листов, я заполнил второй лист и ошибся, попросил перепечатать его. Девушка жахнула кнопку и заново распечатала ВСЕ ПЯТЬ ЛИСТОВ. На резонное удивление она ответила грамотно: «наша система не поддерживает выборочную печать». ВОТ ЭТО ДЕРЬМО вы считаете кто-то будет допиливать?! Вы всерьёз думаете, что современным компиляторам очень надо поддерживать совместимость с 40-летним говнокодом?? Далеко не. Его вообще никто и никогда не будет компилировать - этот говнобанк будет крутиться до тех пор, пока есть процессоры, способные исполнять его код. И наверняка та же история с остальными - их сорсы никому не упёрлись, но да, разрабы будут срать кирпичами, доказывая важность совместимости с предыдущей вермишелью! Вот такой парадокс. :)

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

...Кроме того, собрать ВСЕ бизнес-требования для старых и больших систем невозможно, поэтому, переписать их так же невозможно ;)

ПЕРЕписать - невозможно, но НАписать - вполне. Это в ИТ любая вещь устаревает за 5 лет, бизнес же (для которого это пишется) имеет вполне чёткие задачи, поэтому взять какое-то свежее, современное решение и написать тот же «банк» - было бы великолепно. Даже больше скажу: за последние 5-10 лет программинг стал более отточенным, насыщенным, сложным, поэтому то, что может спроектировать современный архитектор, будет как космическая станция по сравнению с самокатом. Стало реальным (по ресурсам) создавать модульные системы без оглядки на ОЗУ, харды, пропускную способность сети и т.п. Так что софт можно и нужно переписывать, чтобы потомки не кидались в нас фекалиями: «У вас же был нормальный язык, какого __уя вы цеплялись за свои printf'ы?!».

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

C - красивый, законченный язык. А C# и D вторичны по своей сути
Не беря что-то за основу и опираясь только на свой опыт.

Глупости пишете. А то, что практически ВСЕ языки (включая Си) так или иначе вбирают в себя какой-то существующий язык, это ничего?
C#/D создавались не на личном опыте, а на опыте ТЫСЯЧ ПРОГРАММИСТОВ, уже знающих Си. Если все они дружно решили, что «скобочки» - это круто, значит так оно и есть.

C# и D вторичны по своей сути, они созданы как «давайте исправим всё, что нам не нравится»

ну а что ПЛОХОГО-то в том, что язык становится лучше? В чём фундаментальная ошибка Си, что его нельзя брать за основу? Или вы из разряда тех придумщиков, которые изобрели ЛИСП, Брэйнфак и Рефал? :)
«Если вы отличаетесь от других, это не значит, что вы - лучше».

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

...где многое может привести к краху системы. Этот мир можно разрабатывать только таким же «опасным» инструментом как Си.

В корне неверно. Точнее, спутаны понятия. И это очень плохо для вас как программиста.

Давайте проведём аналогию, скажем, с кухней: салат можно нарезать бритвой, чертыхаясь по уши в листьях, но зато ювелирно обрезая засохшие кончики, попутно порезавшись пару раз. А можно тупо взять овощерезку и она сделает всю ту же работу, но намного быстрее и безопаснее. Вопрос: в чём преимущество бритвы? Только в том, что ты «режешь где хочешь»? Ну хоти! Но для конечной системы важны не твои комплексы бога, а надёжный результат.
Аналогично, ещё в бейсике можно было делать PEEK/POKE. ЧЕГО ЕЩЁ вам нехватает для работы из бейсика с оборудованием? Зачем вам ассемблер? (допустим, при равных скоростях) Только по единственной причине - тщеславие в свете причасности к «илитарным кругам, понимающим язык XYZ». Зато бейсик многократно бы уменьшил даже те ошибки, которые вообще к «железу» отношения не имеют: переполнения стека, выход за границы, неправильный указатель и т.п. - вы же не считаете себя настолько идеальным, что не допускаете подобных ошибок?!
Вот за этим и нужна замена Си - он позволяет вам гораздо больше, чем от вас требуется, а вы, как обычный человек, не способны 100% контролировать то, что используете.

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

Девушка жахнула кнопку и заново распечатала ВСЕ ПЯТЬ ЛИСТОВ.

А кто тебя заставлял все пять листов перезаполнять?

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

за последние 5-10 лет программинг стал более отточенным, насыщенным, сложным

Хи-хи.

поэтому то, что может спроектировать современный архитектор, будет как космическая станция по сравнению с самокатом.

Ха-ха.

Стало реальным (по ресурсам) создавать модульные системы без оглядки на ОЗУ, харды, пропускную способность сети и т.п.

Хо-хо.

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

ещё в бейсике можно было делать PEEK/POKE. ЧЕГО ЕЩЁ вам нехватает для работы из бейсика с оборудованием? Зачем вам ассемблер? (допустим, при равных скоростях)

А если не допустим? А если в кернелспейсе?

grusha
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.