Как стать автором
Обновить
1
0
Багаев Дмитрий @bvdmitri

Пользователь

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

Вы говорите, что достаточно синтаксический корректности (в первом случае), это неверно, так как программа может быть синтаксически корректна и при этом даже не компилироваться.

Автор говорит, что достаточно, чтобы программа компилировалась, что опять таки неверно, потому что компилятор вправе на UB выдавать случайный поток байт и не падать.

Все гораздо проще, то что стандарт считает кодом на языке С — то им и является. Все остальное по сути набор букв в текстовом файле, синтаксически корректно или нет уже не важно.
Кстати есть интересный проект UndefinedBehaviourSanitizer. По заявлениям может помочь в поиске UB в рантайме, но сильно бьет по производительности
У компиляторов есть техники обнаружения UB (например функция без return 100% детектится как warning), и в случае с -Werror они выдают ошибку компиляции. Другое дело когда UB слишком хитрое и не очевидное для компилятора. В таком случае может помочь static analysis tools и то не всегда.

Все эти UB необходимы для огромного класса оптимизаций, но получается, что написать валидную программу на языках типа С/С++ довольно тяжело.
Вы не правы! Компилятор не может сказать вам является ли написанный код кодом на языке С или нет. Это может говорить только стандарт, то что данный пример компилируется говорит лишь о том, что компилятор молодец и ничего более.

Как пример я могу написать скрипт, который будет компилировать С/C++ или Java например в зависимости от расширения файла. Мой супер-пупер компилятор будет компилировать исходные коды аж на 3 разных языках — и я потом скажу «Компилятор компилирует исходные эти коды, то это — код на С. Иначе бы выдавалась ошибка компиляции.» Но это же полный бред. Компилятор не может классифицировать принадлежность исходного кода к какому то языку. Это делает стандарт.

И стандарт четко говорит — исходный код содержащий UB — не является кодом на языке С.

Ну мой пример, конечно, вырожденный, но и в реальной жизни есть такой пример: компиляторы С и С++. Компилятор С++ не выдает ошибку компиляции для программ написанных на языке С — но из этого не следует, что исходный код на языке С является также и исходным кодом на языке С++ только потому что компилятор не падает. Более того можно привести пример когда компилятор С++ не сможет скомпилировать программу на языке С. С точки зрения стандарта это два разных языка.

Еще раз то, что не выдается ошибка компиляции — не означает, что исходный код является кодом на языке С с точки зрения стандарта.
А с какой стати он его вообще компилирует, если это не код на Си??


Везение ¯\_(ツ)_/¯. А если серьезно компилятор не может заранее определить есть ли UB в исходном коде, эта задача алгоритмически не разрешима.

Вы не поняли мой посыл. Я имел ввиду, что чтобы показать, что какой то компилятор противоречит стандарту (в данном случае индексация массивов и использование указателей) — надо предоставить исходный код без UB, потому что стандарт не считает программу с UB программой на языке С.
То есть, вопреки общему заблуждению, — индекс массива и соотвествующий ему указатель для компилятора – это совершенно не одно и то же

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

 int table[4];
 bool exists_in_table(int v) { 
     for (int i = 0; i <= 4; i++) { 
         if (table[i] == v) return true;
     } return false;
 }

С точки зрения компилятора этот исходный код не является кодом на языке С. А значит и применять к нему утверждения «а вот в стандарте так и эдак» попросту нельзя.

В этом вся суть стандарта и если написать программу без UB, то есть программу на языке С — то там всегда индексация массива и использование указателей ведет себя одинаково.
Вопрос: если есть механизм отслеживания количества зомби процессов под виндой — то можно ведь встроить этот механизм непосредственно в ОС, собирать статистику и отправлять непосредственно разработчикам.

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


В телеграмме же можно прямо в тексте делать *жирный*, и _курсивный_ если мне память не изменяет. Зачем для этого использовать бота?
Если Observable завершается (onComplete или onError) unsubscribe не нужно делать не нужно, это происходит автоматически.
Объясните пожалуйста, почему нельзя сделать циклы 0..width 0..height? В чем смысл рендерить картинку в случайном порядке (wolfenstein 3D же наверняка не использовала видеоускорители).
64KB / sizeof(int) = 16

Вы серьезно считаете что int занимает в памяти 4KB?
2

Информация

В рейтинге
Не участвует
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность