LINUX.ORG.RU

Скучная сишка

 ,


0

0

D.J.Bernstein предлагает создать скучный компилятор сишки, который навсегда выберет к-л конкретное поведение для всех сортов UB, чтобы решить проблемы с безопасностью.

As a boring platform for the portable parts of boring crypto software, I'd like to see a free C compiler that clearly defines, and permanently commits to, carefully designed semantics for everything that's labeled «undefined» or «unspecified» or «implementation-defined» in the C «standard». This compiler will provide a comprehensible foundation for people writing C code, for people auditing C code, and for people formally verifying C code.

...

Overall I think that these people simply don't understand what most C programmers want. A boring C compiler will very quickly gain users---not merely for security but also for predictability in general; people will appreciate, e.g., having variables automatically initialized to 0. Of course, the compiler has to support the usual C ABI, so that programs compiled with this compiler can be linked to libraries compiled with other compilers (including other languages), and vice versa, allowing an incremental upgrade process.

А я бы юзал. Чем вспоминать каждый раз, какие там допустимые границы значений, где в этом темном подземелье раскиданы грабли, и надеяться на лучшее (привет, memcpy!), лучше следовать принципу debug once, compile everywhere. Производительность для большинства задач проблема даже не первого десятка, а реальные оптимизации все равно всегда были hand-crafted.

Кто что думает?

Перемещено JB из talks

★★

Последнее исправление: arturpub (всего исправлений: 1)

Чем вспоминать каждый раз,

Просто аккуратней пиши. Если использовать здравый смысл, то вероятность столкнуться с UB в Си не больше вероятности встретить на улице лиспера.

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

вероятность столкнуться с UB в Си не больше вероятности встретить на улице лиспера

Если честно, ни разу не видел программы на C или C++ больше сотни строк, которая бы так или иначе не содержала UB. Зачастую это осознанный выбор разработчика.

Gvidon ★★★★
()

Overall I think that these people simply don't understand what most C programmers want

Мне кажется именно этот чувак не очень понимает, что нужно людям, пишушим на Це. Для того, чтобы раз и навсегда зафиксировать все эти «undefined» or «unspecified» or «implementation-defined», придётся пускать программы в виртуальной машине. Он правда думает, что сишники на самом деле в глубине души хотят писать на жабе?

Gvidon ★★★★
()

Производительность для большинства задач проблема даже не первого десятка

Вот только всякая крипта, о которой идёт речь, в список этих задач не входит

Gvidon ★★★★
()

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

hlebushek ★★
()
Последнее исправление: hlebushek (всего исправлений: 1)

В этом нет большой необходимости. Если тебе нужна безопасность и не оч важна производительность, то сейчас есть не меньше десятка хороших языков с компиляторами под них. На одном из них наверняка можно решить твою задачу.

Aswed ★★★★★
()

Так это повлияет на возможности оптимизации. А все ради тех, кому лень придерживаться стандарта.

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

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

А можно примеры таких программ? Хочу держаться от них как можно дальше.

Зачастую это осознанный выбор разработчика.

UB - это осознанный выбор разработчика? Что-то новенькое.

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

А можно примеры таких программ? Хочу держаться от них как можно дальше.

Ядро линукса подойдёт?

UB - это осознанный выбор разработчика?

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

Gvidon ★★★★
()

Зря из толксов убрали.

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

Так это повлияет на возможности оптимизации.

Нафиг нужны такие оптимизации? Ну ошибся я где-то, получил UB, это вообще не повод компилятору решать, что ему теперь всё можно и переколбашивать половину кода. Как это говно отлаживать потом?

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)

Тут есть проблема - очень многое из UB проверить можно только в рантайме.

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

Ядро линукса подойдёт?

А где там UB?

UB - это осознанный выбор разработчика?

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

Может вы путаете UB с compiler specific behaviour?

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

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

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

Нафиг нужны такие оптимизации? Ну ошибся я где-то, получил UB, это вообще не повод компилятору решать, что ему теперь всё можно и переколбашивать половину кода.

Оптимизируют не UB, а нормальный код.

Как это говно отлаживать потом?

Зачем писать говно?

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

У крипты первая проблема стоит гораздо выше всех остальных. Если ее не решать, то остальные решать бессмысленно.

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

А где там UB?

Например, в макро

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

По стандарту это UB. Работает только потому, что в gcc так можно делать. Я вообще не уверен, что ядро можно собрать чем-то кроме gcc, а даже если получится, то оно не упадёт при первом же запуске.

Может вы путаете UB с compiler specific behaviour?

Не путаю. И да, в стандарте нет понятия «compiler specific behaviour».

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

Зачем писать говно?

Мужик, ты гений! Мы просто должны перестать совершать ошибки при написании программ, это же так просто! И почему до сих пор об этом никто не подумал?

Gvidon ★★★★
()

Производительность для большинства задач проблема даже не первого десятка

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

Psych218 ★★★★★
()

А арифметику указателей выкинуть вообще? Потому что иначе ведь от UB избавиться нельзя. И приведение типов указателей тоже. И что делать с указателями на локальные переменные?

Потом, что делать с управлением памятью? GC сделать? Потому что иначе, опять же, от UB не избавиться.

лучше следовать принципу debug once, compile everywhere

Да щас. Пока у тебя библиотеки и ядра разные, не избавишься ты от этого.

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

Это не UB в случае sizeof, про который стандарт что-то знает. С точки зрения стандарта C, «typeof» — это какой-то идентификатор без особых свойств.

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

С точки зрения C это просто невалидный код. И всё. UB возникает когда код исполняется, но что делает неизвестно. Для C UB не может возникнуть в ситуации когда код не компилится.

In computer programming, undefined behavior (UB) is the result of executing computer code written in a programming language for which the language specification does not prescribe how that code should be handled.

Как можно получить UB от того, что тупо не работает?

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

На всякий случай отмечу, что по документации самого gcc такое выражение не является UB:

https://gcc.gnu.org/onlinedocs/gcc/Typeof.html

The operand of typeof is evaluated for its side effects if and only if it is an expression of variably modified type or the name of such a type.

Работает по тому же принципу, что и sizeof()

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

Это не UB в случае sizeof, про который стандарт что-то знает. С точки зрения стандарта C, «typeof» — это какой-то идентификатор без особых свойств.

Который употреблён вместо имени типа (после const). Это будет синтаксическая ошибка. А начиная с C99 implicit function declaration вообще нету, необъявленный идентификатор — это всегда ошибка.

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 2)

Lol, почему бы просто не использовать -Wundefined-behaviour -Werror ? В отличии от сабжа, код после этого будет работать везде (на всех компиляторах). Да, а сабж таки привёл бы к говнокоду, который работает только на одном компиляторе, а на остальных - как получится.

anonymous
()
Ответ на: комментарий от anonymous
#include <stdio.h>

int main()
{
  char a = 1;
  while (a++ > 0);
  puts("hello ub!");
  return 0;
}

какую опцию предлагаешь использовать в этом случае?

писать секурно на с это утопия. надо либо на окамле или аде какой-нибудь.

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

i++ + ++i

Если так сильно дрожат руки — может, стоит завязывать с пьянками?

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

По стандарту это UB.

Да.

Работает только потому, что в gcc так можно делать.

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

В любом случае единственный пример, да еще и весьма специфичный не подходит в качестве общего примера.

И да, в стандарте нет понятия «compiler specific behaviour».

Тем не менее, это именно compiler specific behaviour.

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

Мужик, ты гений!

Спасибо.

Мы просто должны перестать совершать ошибки при написании программ, это же так просто! И почему до сих пор об этом никто не подумал?

Ошибки совершают все. Но не нужно возлагать кривость программиста на компилятор.

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

А все ради тех, кому лень придерживаться стандарта.

Стандарта, который регламентирует нестандартное поведение?

Я не понял, что вы хотели сказать.

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

Потом, что делать с управлением памятью? GC сделать? Потому что иначе, опять же, от UB не избавиться.

Это ещё почему?

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

Неправильная арифметика указателей может привести к UB. Двойной free() или освобождение памяти не выделенной с помощью malloc() это тоже UB. Проблематично убрать UB оставив при этом операции с указательными и ручным высвобождением памяти.

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

Во-первых, этот пример не жизненный, так что не понятно, в чём именно твоя проблема. Во-вторых, можно запретить использовать мат. операции на char без уточнения signed/unsigned. В-третьих, как спасёт от этого т.н. boring c? Что, если на платформе char имеет 12 бит?

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

Это ещё почему?

В дополнение к тому, что сказал omnomnomnus, подумай вот о какой ситуации:

  1. Программа выделила место в куче и поместила туда некоторую структуру.
  2. Указатель на эту структуру был сохранён в нескольких местах.
  3. Этот участок памяти был освобождён.
  4. В какой-то момент этот участок памяти был снова выделен под другой объект.
  5. По ошибке программиста где-то произошло обращение к первоначальной структуре обратился после её освобождения.

Как тут избавиться от UB? На шаге 5 при обращении получится мусор вместо данных.

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

Если использовать здравый смысл, то вероятность столкнуться с UB в Си ...

... близка к 100%

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