The OpenNET Project / Index page

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



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

Оглавление

Выпуск ControlFlag 1.0, инструмента для выявления ошибок в коде на языке Си, opennews (ok), 19-Ноя-21, (0) [смотреть все]

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


83. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от Ordu (ok), 20-Ноя-21, 04:31 
> ошибкой будет только ситуация, когда смысл в поле вкладывается не булевый.

Почему бы алгоритму этот смысл не вычислить? Ему ж это ещё проще будет, чем человеку: достаточно проверить все использования переменной по всей программе, и посмотреть кладётся ли туда когда-нибудь целое, отличное от 0 и 1. Это, конечно, не очень сработает с _реальными_ C'шными программистами, потому что они могут написать "int bool_var = ptr", допустим, вместо "int bool_var = !!ptr" или "int bool_bar = (ptr != NULL)". Но с этим тоже можно справиться, если во-первых, смотреть не только на запись в переменную, но и на использование "if(bool_var)" или "if(bool_var==2)", а во-вторых, уйти от аристотелевой логики в сторону вероятностной, и истинность высказывния "bool_var -- булевская переменная" измерять не двумя значениями {истина, ложь}, а вещественным числом (0, 1), которое будет отражать likelyhood того, что это утверждение истинно в аристотелевском смысле. Собственно этим последним образом человек как правило и поступает. И заметив высокий likelihood несоответствия (предположительного) смысла переменной тому, как она используется, он подключает высшие уровни психики, чтобы рассуждать "логически", то есть анализировать код, пытаясь угадать, что имел в виду писавший, и какой смысл переменной лучше соответствует этому.

Рассуждать "логически" таким образом компьютеры лишь учатся (в смысле теоретически понятно как, но вот практически увязать первый этап, с последующими -- это пока никому вроде не удавалось), но с первым этапом они вполне справляются. Примерно с 90-х годов, после выхода "Probabilistic Reasoning in Intelligent Systems" в 1988. А с первой половины нулевых, когда deep-learning начал работать на практике, то и второй подход к реализации этого первого этапа образовался.

> в текущей версии (7.80) данное поле определено как enum, поэтому теперь такая ситуация исключена.

Нет, не исключена. В C enum может содержать _любое_ значение. C не даёт на этот счёт никаких гарантий. С точки зрения C enum -- это такой целочисленный тип, который можно молча преобразовать к другому целочисленному типу, посредством тупого копирования, может быть с обрезанием старших байтов, или с заполнением их нулями. Другое дело, что использование enum'а даёт свидетельство о намерениях программиста, что статический анализатор может использовать.

Исключена -- это когда компилятор тебе запрещает в enum записывать значения, про которые он не может доказать, что они попадают в список значений этого enum'а.

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

90. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Аноним (90), 20-Ноя-21, 10:16 
по стандарту ложное значение 0, истинное не 0.
Ответить | Правка | Наверх | Cообщить модератору

91. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от Ordu (ok), 20-Ноя-21, 10:51 
> по стандарту ложное значение 0, истинное не 0.

И что? Глянь:

struct MyStruct {
    int my_flag: 1;
}

int main() {
    struct MyStruct var;
    var.my_flag = 2;
    if(var.my_flag) {
        printf("yes\n");
    } else {
        printf("no\n");
    }
    return 0;
}

Как ты думаешь, что оно напишет: "yes" или "no"? А теперь ещё один релевантный факт: адреса как правило выравнивают, и поэтому любой адрес, с огромной вероятностью будет иметь последним битом 0 (со вполне серьёзной вероятностью даже три последних бита будут нулями), и если ты из указателя сделаешь bool, то ты рискуешь нарваться на ровно ту же самую проблему. Даже если ты указатель положишь в полноценный int, то есть (практически нулевая, но всё же) вероятность получить 0 в результате на 64 битной системе.

Сишному стандарту нельзя доверять, он намеренно написан так, чтобы раскладывать на пути у нубов грабли (а если серьёзно, то в данном случае, истиной считается всё, кроме нуля по одной простой причине: Ритчи не знал, что ещё можно сделать, если тупой программист сунет в if не ноль -- не панику же выкидывать, так? А до обработки исключений они не доросли ещё тогда.). В C bool должна быть 0 для false, и 1 для true. Плюнь в лицо любому, кто скажет иначе. Все сколь-нибудь вменяемые проекты на C следят за тем, чтобы плевать в лицо тем, кто верит стандарту в отношении bool.

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

92. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от n00by (ok), 20-Ноя-21, 11:12 
>> по стандарту ложное значение 0, истинное не 0.
> И что?

Он забыл процитировать стандарт.

> В C bool должна быть 0 для false, и 1 для true.

Так и есть. Из N1570:

6.2.5 Types
2 An object declared as type _Bool is large enough to store the values 0 and 1.

6.3.1.2 Boolean type
1 When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.

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

93. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от Sw00p aka Jerom (?), 20-Ноя-21, 11:42 
>Так и есть. Из N1570:

строгое значение, и что по вашему должен делать компилятор когда bool сравнивается с 2-ой?

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

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

110. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 20-Ноя-21, 14:16 
>>Так и есть. Из N1570:
> строгое значение, и что по вашему должен делать компилятор когда bool сравнивается
> с 2-ой?

По-моему, меня пытаются убедить, что я должен за кого-то прочитать integer promotion rules.

> зачем анализатор должен об этом говорить если компилятор должен выдавать ошибку о
> несоответсвии типов? Делает он это?

Это он ведущему программисту Rosa Tresh должен, у которого типизация в Си строгая.

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

116. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 20-Ноя-21, 14:50 
> По-моему, меня пытаются убедить, что я должен за кого-то прочитать integer promotion
> rules.

ясно, все неявное становится явным

> Это он ведущему программисту Rosa Tresh должен, у которого типизация в Си
> строгая.

ну раз не строгая, то зачем сравнение bool с 2-ой должно считаться ошибкой? даже компилятору чихать на это, а ваш анализатор втирает про ошибку.


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

119. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 20-Ноя-21, 14:58 
Да мне пофик на анализатор, кто-то наврал про стандарт, это недоразумение я и исправил.

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

123. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 20-Ноя-21, 15:12 
> Да мне пофик на анализатор, кто-то наврал про стандарт, это недоразумение я
> и исправил.

почему это наврал?

он написал "по стандарту ложное значение 0, истинное не 0."

а вы привели цитату из стандарта

"When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1."

разве не одно и тоже написано?

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

153. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 21-Ноя-21, 10:15 
>> Да мне пофик на анализатор, кто-то наврал про стандарт, это недоразумение я
>> и исправил.
> почему это наврал?

Вероятно, потому что не читал стандарт.

> он написал "по стандарту ложное значение 0, истинное не 0."
> а вы привели цитату из стандарта
> "When any scalar value is converted to _Bool, the result is 0
> if the value compares equal to 0; otherwise, the result is
> 1."
> разве не одно и тоже написано?

Очевидно, "не 0" и 1 это не одно и то же, как и "скалярное" и "булево".

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

167. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 21-Ноя-21, 14:36 
> Очевидно, "не 0" и 1 это не одно и то же, как
> и "скалярное" и "булево".

очевидно у вас с англ проблемы

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

168. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 21-Ноя-21, 15:21 
> я не могу найти в стандарте "ложное значение 0, истинное не 0"
> и поэтому проецирую.

Не волнуйтесь, ничего страшного. Я тоже не нашёл. Да и зачем? Бремя доказательства наличия в стандарте такого утверждения лежит на заявителе.

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

170. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 21-Ноя-21, 17:56 
> Я тоже не нашёл.

а if () {} что делает? любое не нулевое значение - истина.

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

187. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 22-Ноя-21, 08:50 
>> Я тоже не нашёл.
> а if () {} что делает?

Для поиска ответа надо всего лишь открыть стандарт и прочитать пункт The if statement.

> любое не нулевое значение - истина.

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

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

204. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 22-Ноя-21, 21:38 
>Многократное повторения мантр

смотрим в книгу видим фигу, ясно


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

206. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 23-Ноя-21, 07:45 
> смотрим в книгу видим фигу

А я всё думаю, что же Вы там такое видите, что процитировать стесняетесь.

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

210. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 23-Ноя-21, 11:40 
6.3.1.2 Boolean type
1 When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.

и собственно гугл перевод

6.3.1.2 Логический тип
1 Когда любое скалярное значение преобразуется в _Bool, результат равен 0, если значение сравнивается с 0; в противном случае результат равен 1.

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

211. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 23-Ноя-21, 12:03 
> 6.3.1.2 Boolean type
> 1 When any scalar value is converted to _Bool, the result is
> 0 if the value compares equal to 0; otherwise, the result
> is 1.
> и собственно гугл перевод
> 6.3.1.2 Логический тип
> 1 Когда любое скалярное значение преобразуется в _Bool, результат равен 0, если
> значение сравнивается с 0; в противном случае результат равен 1.

Напоминаю, что обещали найти "истинное не 0". -1 это не 0. 2 это не 0. Это сложно понять?

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

214. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 23-Ноя-21, 13:21 
комент 3.90

"по стандарту ложное значение 0, истинное не 0."

так и есть, по стандарту любое скалярное значение которое "не ноль" - истина, то есть неявно приводится к булевому значению 1.

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

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

215. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 23-Ноя-21, 14:31 
> комент 3.90
> "по стандарту ложное значение 0, истинное не 0."
> так и есть

Но никто третий день не может привести цитату, тогда как _Bool определён как 0 или 1.

> по стандарту любое скалярное значение которое "не ноль" -
> истина, то есть неявно приводится к булевому значению 1.

СКАЛЯРНОЕ. ПРИВОДИТСЯ.

> вопрос, и где тут "наврал" аатор сего комента?

В формулировке.

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

216. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 23-Ноя-21, 15:43 
> Но никто третий день не может привести цитату, тогда как _Bool определён
> как 0 или 1.

так речь не об этом была, и никто это не оспаривал, что булевый тип есть множество из двух элементов {0 - false, 1 - true}

> СКАЛЯРНОЕ. ПРИВОДИТСЯ.

так и есть приведение скалярного к булевому типу, и в случае со статьей речь шла о сравнении булевого типа со скалярным (int s->keepon), а в таком случае происходит неявное привидение типов. А что нам говорит стандарт при таком неявном приведении? Ровно то, что и сказал автор комента 3.90 - "по стандарту ложное значение 0, истинное не 0."

Он не говорил, что булевый тип состоит из элемента 0 - false и всяких скаляров в значении true.

> В формулировке.

это не формулировка определения булевого типа, это формулировка правила приведения любого скалярного типа к булевому. Вы сами привели две цитаты из стандарта.


6.2.5 Types
2 An object declared as type _Bool is large enough to store the values 0 and 1.

тут определяются допустимые значения булевого типа.

6.3.1.2 Boolean type
1 When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.

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


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

217. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 23-Ноя-21, 15:58 
>> Но никто третий день не может привести цитату, тогда как _Bool определён
>> как 0 или 1.
> так речь не об этом была

Дословно: "по стандарту ложное значение 0, истинное не 0".

Нет цитаты с определением ложного и истинных значений? Я могу её привести, но зачем мне это надо? Ищите и доказывайте сами, пора наконец уже скачать стандарт и почитать, а не копировать 10й раз мои оттуда цитаты, разбавляя их демагогией.

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

218. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 23-Ноя-21, 17:09 
> Нет цитаты с определением ложного и истинных значений? Я могу её привести, но зачем мне это надо?

Утверждение "по стандарту ложное значение 0, истинное не 0" вы себе надомули как неверное определение булевого множества. А по сути автор говорит о правиле приведения скаляров к булевому множеству. И никто в здравом уме не будет спорить с определением булевого множества, которое состоит из двух элементов {0, 1}. То, что автор не расписал свое утверждение в 10 строк, от этого его утверждение "враньем" не стало, и собственно ему нужно было написать более в строгой форме, которая как раз и написана в стандарте. А вам нужно было просто логически уловить смысл данного утверждения, а не клеймить "враньем".


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

220. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 23-Ноя-21, 17:22 
>> Нет цитаты с определением ложного и истинных значений? Я могу её привести, но зачем мне это надо?
> Утверждение "по стандарту ложное значение 0, истинное не 0"

Остаётся недоказанным.

> А по сути автор говорит о

Вы автор? Или читаете его мысли?

Буквально: ложное значение 0, истинное не 0.

Стандарт действительно определяет значения (values) как истинное (true) так и ложное (false). Но некоторые знатоки стандарта не способны прочесть стандарт и найти там эти определения, потому оперируют теми цитатами, которые я им заботливо предоставил. Это становится интересно: человек не способен выполнить элементарный поиск по тексту, никогда не читал стандарт, но при этом с умным видом спорит.

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

222. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 23-Ноя-21, 17:45 
> Остаётся недоказанным.

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

> Вы автор? Или читаете его мысли?

вы прочли и осмыслили по своему, я прочел и осмыслил по своему, раз на то пошло, давайте спросим у автора, чья мысль близка (телепатов среди нас надеюсь нет)

> Стандарт действительно определяет значения (values) как истинное (true) так и ложное (false).
> Но некоторые знатоки стандарта не способны прочесть стандарт и найти там
> эти определения, потому оперируют теми цитатами, которые я им заботливо предоставил.

не в стандарте это надо икать, а в трудах того же Буля. В моем марсианском языке 2 (false), 3 (true). И любое другое N будет приводиться к 3, если явно не есть 2.

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

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


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

225. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 24-Ноя-21, 07:14 
>>> Утверждение "по стандарту ложное значение 0, истинное не 0"
>> Остаётся недоказанным.
> определения не доказываются, а используются в доказательстве, логическом выводе.

Вернул выкинутое при цитировании, что бы подмена была видна. Ищите в стандарте определение, что бы доказать утверждение, что стандарт таковое содержит.

>> Вы автор? Или читаете его мысли?
> вы прочли и осмыслили по своему, я прочел и осмыслил по своему,

Я прочёл в стандарте буквальное определение, но процитировал сюда другие. И в ответ на них читаю отсебятину.

> раз на то пошло, давайте спросим у автора, чья мысль близка
> (телепатов среди нас надеюсь нет)

Спросите.

>> Стандарт действительно определяет значения (values) как истинное (true) так и ложное (false).
>> Но некоторые знатоки стандарта не способны прочесть стандарт и найти там
>> эти определения, потому оперируют теми цитатами, которые я им заботливо предоставил.
> не в стандарте это надо икать

"по стандарту..." - значит ищите в стандарте.

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

224. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 23-Ноя-21, 18:31 
> Остаётся недоказанным.

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2310.pdf

Раздел 6.8.4.1 The if statement

if ( expression ) statement
if ( expression ) statement else statement

6.8.4.1 The if statement
Constraints
1 The controlling expression of an if statement shall have scalar type.

Semantics
2 In both forms, the first substatement is executed if the expression compares unequal to 0. In the else form, the second substatement is executed if the expression compares equal to 0. If the first substatement is reached via a label, the second substatement is not executed.
3 An else is associated with the lexically nearest preceding if that is allowed by the syntax.

Сделаем акцент на "if the expression compares unequal to 0"

Если выражение скаляра НЕ РАВНО 0, то ИСТИНА, иначе - ЛОЖЬ, что равнозначно "ложное значение только 0, истинное не 0".


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

226. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 24-Ноя-21, 07:16 
Ну вот, уже освоили поиск по названиям пунктов, которые я давал. Но это не про истину и ложь, а про скаляры и приведение типов. Продолжайте поиск.
Ответить | Правка | К родителю #224 | Наверх | Cообщить модератору

219. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 23-Ноя-21, 17:15 
>Дословно: "по стандарту ложное значение 0, истинное не 0".

а если дословно, то тут можно придраться ко всему, и понимай как хочешь. Вы поняли это утверждение  неверным определением чего-то, хотя в нем нет никакой "дословно" строгости (конкретики). Оно не начинается со слов "Это определение ....", там не указан "стандарт" чего, а вы в итоге отвечаете конкретными цитатами из конкретного стандарта, не зная точно о нем ли речь. Таких придирок можно написать еще кучу, только это пустая трата времени.


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

221. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 23-Ноя-21, 17:31 
>>Дословно: "по стандарту ложное значение 0, истинное не 0".
> а если дословно, то тут можно придраться ко всему, и понимай как
> хочешь.

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

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

Я понял его так как оно могло бы быть описано в стандарте. При этом оно там там есть, но "истинное" определено иначе. Определения следуют из тех цитат, что я опубликовал ранее. Цитаты адресованы Ordu, поскольку выводы он и без стандарта сделал. Если кому-то надо буквальное определение -- то надо просто его попросить, а не устраивать споры и манипуляции.

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

223. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 23-Ноя-21, 17:49 
> Это если не читать стандарт, тогда можно. Стандарт в 100 раз более
> скрупулёзен чем даже Ordu.

какой стандарт? (пошли уже придирки) - вы же не телепат, с чего вы взяли что речь о стандарте С?

> Я понял его так как оно могло бы быть описано в стандарте.

Так могло быть, или все же описано?

> но "истинное" определено иначе.

В студию то самое определение.

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

227. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 24-Ноя-21, 07:23 
>> Это если не читать стандарт, тогда можно. Стандарт в 100 раз более
>> скрупулёзен чем даже Ordu.
> какой стандарт? (пошли уже придирки) - вы же не телепат, с чего
> вы взяли что речь о стандарте С?

Речь шла о языке Си, стандарт языка Си. Где якобы "по стандарту ложное значение 0, истинное не 0"

>> Я понял его так как оно могло бы быть описано в стандарте.
> Так могло быть, или все же описано?

Естественно, стандарт определяет оба значения. Но не так, как ему приписывают некоторые.

>> но "истинное" определено иначе.
> В студию то самое определение.

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

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

228. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 24-Ноя-21, 11:49 
>Речь шла о языке Си, стандарт языка Си. Где якобы "по стандарту ложное значение 0, истинное не 0"

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

Или вы ожидаете, что там будет "истина" это тогда и только тогда, когда 1? И оппеделение понятия "истина" и "истинно" - два разных определения, ибо первое это существительное, а второе прилагательное от слова истинный. "истинно" - тогда и только тогда, когда "истина" не равна 0, ровно так описано в стандарте непосредственно в разделе оператора if, который собственно оперирует истинными значениями.

>Пока я не вижу вежливой просьбы

на этом можем и закончить разговор, сами знаете с кого ничего не спрашивают.

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

229. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 24-Ноя-21, 16:26 
>>Речь шла о языке Си, стандарт языка Си. Где якобы "по стандарту ложное значение 0, истинное не 0"
> ок, тогда выше есть выдержка определения условного оператора, там написано ровно то,
> что описал автор выше.

Не надоело? Там даже слов true и false нет. Я понимаю, что со стандартом надо уметь работать, но уже можно было тупо поиском по тексту найти.

>>Пока я не вижу вежливой просьбы
> на этом можем и закончить разговор, сами знаете с кого ничего не
> спрашивают.

Я знаю, что бремя доказательства лежит на заявителе, но некоторым важнее пафос, чем сохранить лицо.

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

230. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 24-Ноя-21, 21:07 
>Не надоело? Там даже слов true и false нет.

а что должно было быть, когда есть понятие нуля и не нуля?


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

231. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 25-Ноя-21, 07:38 
>>Не надоело? Там даже слов true и false нет.
> а что должно было быть, когда есть понятие нуля и не нуля?

Должно быть подтверждение заявления "по стандарту ложное значение 0, истинное не 0". А именно цитата стандарта со словами "value", "true" и "false". Что бы её найти, должен быть достаточно развит межушный ганглий. Пока ничего из вышеперечисленного не наблюдается. Даю последний шанс поискать самостоятельно.

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

233. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 25-Ноя-21, 18:23 
> Должно быть подтверждение заявления "по стандарту ложное значение 0, истинное не 0".

Так и написано

6.3.1.2 Boolean type
1 When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.


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

234. " Sw00p aka Jerom против стандарта"  +/
Сообщение от n00by (ok), 26-Ноя-21, 11:59 
Дамы и господа, делайте ставки!

В левом углу ринга непревзойдённый натягиватель смыслов, профессор болтологии, несравненный Sw00p aka Jerom! Уже неделю спит и видит в стандарте "ложное значение 0, истинное не 0".

В правом углу ринга действительная цитата стандарта языка Си:

7.18 Boolean type and values <stdbool.h>

3 The remaining three macros are suitable for use in #if preprocessing directives. They
are
true
which expands to the integer constant 1,
false
which expands to the integer constant 0 [...]

Порвёт ли Sw00p aka Jerom объективную реальность как Тузик грелку?

Бокс!

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

235. " Sw00p aka Jerom против стандарта"  +/
Сообщение от Sw00p aka Jerom (?), 26-Ноя-21, 14:06 
> directives. They
> are
> true
> which expands to the integer constant 1,
> false
> which expands to the integer constant 0 [...]

вот она истина, ну и замените 1 на 2 в своем макросе true и скормите оператору if (true)

пс: хук слева, противник потрясен но стоит на ногах, чем же он ответит.

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

236. " Sw00p aka Jerom против стандарта"  +/
Сообщение от n00by (ok), 26-Ноя-21, 14:28 
> замените 1 на 2 в своем макросе true

Упростим:

Балабол заявил, что в стандарте "значение ... истинное не 0"

В стандарте: value ... true which expands to the integer constant 1

Следовательно, заявление балабола "в стандарте ... истинное не 0" ложно.

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

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

237. " Sw00p aka Jerom против стандарта"  +/
Сообщение от Sw00p aka Jerom (?), 26-Ноя-21, 16:03 
> Балабол заявил, что в стандарте "значение ... истинное не 0"
> В стандарте: value ... true which expands to the integer constant 1

повторяю еще раз, "истина" (как хранимое значение) не равно "истинное" (сравниваемое значение)

и в операторе if "истинное" это тогда когда сравнивается со значением не 0.

еще раз вопрос, заменив значение вашей "истины" в макросе на 2, от этого if (true) будет не истинным? А про если заменить false на 2 я промолчу.

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

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

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

238. " Sw00p aka Jerom против стандарта"  +/
Сообщение от n00by (ok), 27-Ноя-21, 08:06 
Заявление балабола: "по стандарту ... значение ... истинное не 0"

Содержимое стандарта 7.18/3: "value ... true ... 1"

Всё сходится буквально, кроме "не 0" и "1".

Продолжаем наблюдать борьбу балабола с объективной реальностью. Да, тяжело остановиться, после недели упорствований.

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

239. " Sw00p aka Jerom против стандарта"  +/
Сообщение от Sw00p aka Jerom (?), 27-Ноя-21, 11:49 
> Заявление балабола: "по стандарту ... значение ... истинное не 0"

да именно "истинное", а не "истина"

> Содержимое стандарта 7.18/3: "value ... true ... 1"

это содержимое макроса "истина", а "истинное" значение.

> Всё сходится буквально, кроме "не 0" и "1".

не 0, значить "истинно".

> Продолжаем наблюдать борьбу балабола с объективной реальностью. Да, тяжело остановиться,
> после недели упорствований.

разницу между "истина" и "истинное" не видим, учите русский язык.

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


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

240. " Sw00p aka Jerom против стандарта"  +/
Сообщение от n00by (ok), 27-Ноя-21, 13:16 
Заявление балабола: "по стандарту ... значение ... истинное не 0"

Содержимое стандарта 7.18/3: "value ... true ... 1"

Перестать быть балаболом очень просто. Необходимо и достаточно начать говорить правду. Что-то вроде: по стандарту значение истинное 1, а не "не 0". Что же мешает?

>> Содержимое стандарта 7.18/3: "value ... true ... 1"
> это содержимое макроса "истина", а "истинное" значение.

Балабол не знает английский? Истина это truth. Но это слишком просто. Что-то ещё мешает балаболу. ;)

> не 0, значить "истинно".

Да он ещё и русский не знает. Но и это ещё не всё. ;)

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

241. " Sw00p aka Jerom против стандарта"  +/
Сообщение от Sw00p aka Jerom (?), 27-Ноя-21, 14:25 
продолжайте в том же духе, ниже копипаста комента

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

242. " Sw00p aka Jerom против стандарта"  +/
Сообщение от n00by (ok), 28-Ноя-21, 07:34 
Что же заставило Sw00p aka Jerom, который впервые увидел выдержки из стандарта неделю назад, всё это время отрицать объективную реальность? Сможет ли балабол объяснить свои действия, или сольётся?
Ответить | Правка | К родителю #241 | Наверх | Cообщить модератору

243. " Sw00p aka Jerom против стандарта"  +/
Сообщение от Sw00p aka Jerom (?), 28-Ноя-21, 12:45 

> неделю назад, всё это время отрицать объективную реальность?

вы уже азбуку повторили?

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

244. " Sw00p aka Jerom против стандарта"  +/
Сообщение от n00by (ok), 28-Ноя-21, 17:20 
Могу повторить последний фокус. Есть ещё пара лишних недель?
Ответить | Правка | К родителю #243 | Наверх | Cообщить модератору

245. " Sw00p aka Jerom против стандарта"  +/
Сообщение от Sw00p aka Jerom (?), 28-Ноя-21, 17:25 
> Могу повторить последний фокус. Есть ещё пара лишних недель?

продолжайте, флаг вам в руки

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

246. " Sw00p aka Jerom против стандарта"  +/
Сообщение от n00by (ok), 28-Ноя-21, 17:35 
Хорошо. Осталось уточнить один момент. У тебя уже было такое, что администратор удалил множество твоих сообщений с матом? Или это кто-то другой за тебя постарался?
Ответить | Правка | К родителю #245 | Наверх | Cообщить модератору

247. " Sw00p aka Jerom против стандарта"  +/
Сообщение от Sw00p aka Jerom (?), 29-Ноя-21, 00:28 
> Хорошо. Осталось уточнить один момент. У тебя уже было такое, что администратор
> удалил множество твоих сообщений с матом? Или это кто-то другой за
> тебя постарался?

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

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

248. " Sw00p aka Jerom против стандарта"  +/
Сообщение от n00by (ok), 29-Ноя-21, 07:51 
>> Хорошо. Осталось уточнить один момент. У тебя уже было такое, что администратор
>> удалил множество твоих сообщений с матом? Или это кто-то другой за
>> тебя постарался?
> а с коих пор мат не должен пресекаться модераторами?

Значит это ты матерился.

> с моей стороны
> мат только в ответ может быть

Вот отрицающему текст стандарта балаболу я обязательно поверю.

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

В тот раз тебе нажали на больное место и тебя прорвало.

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

249. " Sw00p aka Jerom против стандарта"  +/
Сообщение от Sw00p aka Jerom (?), 29-Ноя-21, 11:20 
> Значит это ты матерился.

только щас дошло?  

> Вот отрицающему текст стандарта балаболу я обязательно поверю.

наивный

> В тот раз тебе нажали на больное место и тебя прорвало.

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

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

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

250. " Sw00p aka Jerom против стандарта"  +/
Сообщение от n00by (ok), 29-Ноя-21, 11:52 
Ой, ой, полегче на поворотах с нотациями и попыткой списать дефекацию ганглия на алкогольное опьянение. Всё есть в истории https://opennet.ru/51523-llvm

Когда душка хватит от своего имени написать, тогда и поговорим.

Профессор нашёлся. Тьфу. Иди в подворотне языком шебурши про своих родителей.

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

96. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Аноним (31), 20-Ноя-21, 13:00 
> var.my_flag = 2;
> if(var.my_flag) {

если ты проверяешь значение как if(x){ ... }, значит ты проверяешь его на "не ноль".
напр., if (ptr) { *ptr = VAL; } -- это указатель;

на ноль или NULL ты его проверяешь как if (!ptr) {...}.

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

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


> var.my_flag = 2;

эта строка сразу выглядит ошибкой.
потому что название my_flag подразумевает ноль и не-ноль, причём не-ноль в сях обычно пишется 1.
другие ненулевые значения собьют с толку программистов, которые будут работать с кодом.
поэтому не-ноль -- это всегда 1.

если же ты присваиваешь значению 2, значит ты не считаешь значение булевым.
(и ты не считаешь его действительным.  чтобы присвоить действительное значение, писать надо с десятичной точкой x = 2.0, x = 0.0 или x = .0).

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


сишный стандарт -- он для людей, занимающихся разработкой системного или компактного ПО.
ты же стараешься изготовить некий newspeak (известный также как "новояз"), который лишит людей возможности делать ошибки и писать неправильные вещи, так что любой дурак сможет написать программу любой сложности.
все начинающие этим страдают.
поэтому правило: "создай систему, которой сможет пользоваться даже дурак, и только дурак захочет ею пользоваться" (с).

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

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

98. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от Аноньимъ (ok), 20-Ноя-21, 13:12 
>сишный стандарт -- он для людей, занимающихся разработкой системного или компактного ПО.

Да вы издеваетесь?
Вы сами только что простыню накатали о такой простой и одназначной вещи как булева переменная.
Каким образом ЭТО для людей?

Отсутствие системы типов как таковой это не для людей.

И да, код с такими чудесами ниразу не переносимый и не кроссплатформенный.

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

105. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Аноним (-), 20-Ноя-21, 14:02 
Анон все правильно говорит, ну всмысле про сравнение на неноль. дальше читать лень. Кто не понимает сей - начинает толкать ахинею про стандарты и бульёны
Ответить | Правка | Наверх | Cообщить модератору

127. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от Аноним (31), 20-Ноя-21, 15:46 
Простыня имеет отношение не к "компактным программам на C",
а к непонятливости некоторых комментаторов.

Путающих к тому же предмет рассуждения дважды в пяти строках человечьего текста.
Компилятор бы вас не понял.


> Каким образом ЭТО для людей?

Поинтересуйтесь на kernel.org.


> И да, код с такими чудесами ниразу не переносимый и не кроссплатформенный.

Не поверите, но только одной из задач C была переносимость кода первых UNIX на разные платформы, с совместимостью которых в 70-ых были большие проблемы.
Также можете поинтерсоваться у любителей играть с ардуиной или писать для андройдов.

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

118. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Sw00p aka Jerom (?), 20-Ноя-21, 14:57 
>если же ты присваиваешь значению 2, значит ты не считаешь значение булевым.

значимость (значение) всегда предшествует истинности, машина ничего не знает об истинности, она работает со значениями. Истинность (какое из значений считать истиной) подразумевает человек,

2 - истина, 3 - инверсия (отрицание) истины (пример из марсианского языка).

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

145. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от Прохожий (??), 21-Ноя-21, 00:19 
Думаю, это все-таки тебе надо поразмыслить вот над чем. Программирование чего-либо - это не процесс ради процесса. Программированием обычно какую-то конечную цель пытаются достичь. И если на языке А это делается с головой болью, бессонными ночами и нервотрепкой в попытке разобраться, где произошло некорректное приведение типов или обращение к не той области памяти, а на языке Б такие ошибки сведены к минимуму, то разумный рациональный человек выберет язык Б.
А вот неосилятор языка Б будет орать на каждом углу о своей исключительности и гениальности: ведь он может на языке А написать за неделю то, что на языке Б делается спокойно за день. Только вопли его вряд ли кому-то будут интересны.
Ответить | Правка | К родителю #96 | Наверх | Cообщить модератору

172. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Урри (ok), 21-Ноя-21, 18:43 
Харош троллить детей.
Ты пишешь в однобитовое поле двойку, теряя все биты переполнения. Ясное дело в сравнение уйдет ноль. Об этом, кстати, компилятор прямо говорит:

warning: overflow in conversion from ‘int’ to ‘signed char:1’ changes value from ‘2’ to ‘0’

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

А ты не делай bool, потому что это не правильно. И компилятор тебе об этом тоже совершенно недвусмысленно скажет. То, что С позволяет тебе по желанию стрелять в ногу не значит что ты обязан это делать. Просто пиши if (my_pointer) и не будет никаких проблем.

_Bool x = (_Bool) &var;
warning: the address of ‘var’ will always evaluate as ‘true’

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

186. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Ordu (ok), 21-Ноя-21, 23:46 
> Харош троллить детей.
> Ты пишешь в однобитовое поле двойку, теряя все биты переполнения. Ясное дело
> в сравнение уйдет ноль. Об этом, кстати, компилятор прямо говорит:
> warning: overflow in conversion from ‘int’ to ‘signed char:1’
> changes value from ‘2’ to ‘0’

Ты про principle of the least surprise слышал? Так вот, этот принцип _требует_, чтобы когда я выполнял бы в коде что-нибудь типа:

my_struc.field = does_sun_shines_now();

в этой самом my_struc.field оказывалось бы булевское значение. Без переполнений и прочего. Варнинг может считаться оправданием, но если здесь функция вернёт 2 то компилятор уже не напишет никакого варнинга.

> _Bool x = (_Bool) &var;

Мне, по-моему, ни разу не приходилось сталкиваться с кодом на C, который использовал бы _Bool. 20+ лет прошло с его введения в стандарт, а никто не пользуется. Я б тоже не стал: меня эстетически возмущает _Bool. Я могу представить себе имечко похуже, которое разработчики стандартов могли бы придумать, скажем _B0_o1, но даже оно не сильно хуже чем _Bool. "Как добавить в стандарт полезную фичу так, чтобы ею никто не пользовался бы?" -- "Сделай её настолько отвратной, насколько сможешь, и вуаля".

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

188. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 22-Ноя-21, 09:07 
> Ты про principle of the least surprise слышал? Так вот, этот принцип
> _требует_, чтобы когда я выполнял бы в коде что-нибудь типа:
> my_struc.field = does_sun_shines_now();
> в этой самом my_struc.field оказывалось бы булевское значение.

Упомянутый принцип в данном случае запрещает сохранять результат функции _now. Си язык императивный, значит команды выполняются последовательно. К моменту проверки my_struc.field тот момент "сейчас" уже в прошлом, Солнце могло зайти.

Корректна следующая конструкция, где результат 2 вполне допустим

if ( does_sun_shines_now() ) {

}

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

192. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Ordu (ok), 22-Ноя-21, 09:53 
Во-первых, тебя сейчас понесло в сторону. Даже если ты прав, то ты описываешь _ещё_ один источник удивления для программиста, не отменяя при этом тот, который описываю я.

Во-вторых, ...

> К моменту проверки my_struc.field тот момент "сейчас" уже в прошлом, Солнце могло зайти.

То есть gettimeofday нельзя вызывать, потому что когда мы получили результат он уже неактуален? И сохранение файла с таймстампом некорректно, потому что таймстамп уже в момент сохранения отстаёт от текущего времени, и с каждой прошедшей секундой отстаёт ещё на секунду, так?

> Корректна следующая конструкция, где результат 2 вполне допустим

Нет. Если следовать твоей логике то он тоже недопустим, поскольку возврат из функции занимает время, за которое Солнце вполне могло зайти. Корректным способом будет лишь

1. sun.lock() -- залочили солнце, и всё связанное с ним, чтобы оно не меняло своего состояния
2. вызвали does_sun_shines_now, обработали результат
3. sun.unlock()

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

193. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 22-Ноя-21, 10:25 
> Во-первых, тебя сейчас понесло в сторону. Даже если ты прав, то ты
> описываешь _ещё_ один источник удивления для программиста, не отменяя при этом
> тот, который описываю я.

Ну да, когда состояние где-то сохраняется - это потенциальный источник ошибок. Некоторые этому почему-то удивляются. Я правильно понимаю, что Rust в основе своей функциональный с императивными возможностями? Тогда предложенная тобой запись там м.б. корректна.

> Во-вторых, ...
>> К моменту проверки my_struc.field тот момент "сейчас" уже в прошлом, Солнце могло зайти.
> То есть gettimeofday нельзя вызывать, потому что когда мы получили результат он
> уже неактуален? И сохранение файла с таймстампом некорректно, потому что таймстамп
> уже в момент сохранения отстаёт от текущего времени, и с каждой
> прошедшей секундой отстаёт ещё на секунду, так?

Всё это в ряде случаев следует учитывать, но обычно прокатывает и так, поскольку ОС не является системой реального времени. С gettimeofday() дело обстоит ещё хуже, поскольку разрешение таймера даёт погрешность.

>> Корректна следующая конструкция, где результат 2 вполне допустим
> Нет. Если следовать твоей логике то он тоже недопустим, поскольку возврат из
> функции занимает время, за которое Солнце вполне могло зайти. Корректным способом
> будет лишь
> 1. sun.lock() -- залочили солнце, и всё связанное с ним, чтобы оно
> не меняло своего состояния
> 2. вызвали does_sun_shines_now, обработали результат
> 3. sun.unlock()

Этот неудобный момент обходится за счёт т.н. sequence points.

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

195. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от Ordu (ok), 22-Ноя-21, 12:33 
> Ну да, когда состояние где-то сохраняется - это потенциальный источник ошибок. Некоторые этому почему-то удивляются.

Принцип наименьшего удивления, если присмотреться, субъективный в своей основе, в том смысле что не заглядывая в головы программистов, и в то для решения каких задач они применяют свои головы, невозможно говорить об их удивлении. В случае struc.field = some_funny_call(), программист может не помнить о том, что field занимает 1 бит. Или он может не знать об этом, потому что это поле ещё вчера утром занимало 4 байта, но вчера днём его коллега занимался оптимизациями расхода памяти, заметил, что иногда одновременно существуют миллионы инстансов этой структуры, и упаковал её покомпактнее.

А если программиста удивляет сохранение состояния, то... не, это плохо, но если есть какие-то конкретные предложения о дизайне языка, которые могут снять это удивление, то можно поговорить предметно. Если же нету, то значит с этим просто надо жить.

> Я правильно понимаю, что Rust в основе своей функциональный с императивными возможностями?

В современном программировании сложно говорить о "функциональных" и "императивных" языках, поскольку граница размыта до невозможности. Есть динозавры, типа C и Haskell, в которых всё понятно, но с современными языками классификации, созданные в прошлом тысячелетии, уже не работают. Называть раст функциональным -- то же самое, что называть его ООП языком: да, он имеет встроенные инструменты, помогающие писать в функциональном или ООП стиле, но как в нём нет законченной реализации ООП, так же в нём нет законченной реализации поддержки функциональщины.

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

Взять к примеру PathBuf:

fn make_directories(prefix: &str) -> Result<(), io::Error>
    let mut pathbuf = PathBuf::new();
    pathbuf.push(prefix);
    pathbuf.push("bin");
    // работаем с путём $prefix/bin
    pathbuf.pop();
    pathbuf.push("share");
    // теперь с путём $prefix/share
}

Это не функционально от слова совсем. Но зато не надо под каждый путь выделять свежий кусок памяти из кучи.

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

В rust'е проблема с bool'ом не существует не из-за функциональности/императивности, а потому как bool -- это тип, который занимает 1 байт и принимает одно из двух значений {true, false}. Положить его в однобитную переменную просто так не выйдет, придётся писать обвязку, которая будет конвертать true/false в бит и обратно. И указатель в bool-переменную тоже положить не удастся, потому что он указатель, а не bool. Впрочем, у указателя есть метод is_null(), который недеструктивно конвертает указатель в этот самый bool. Короче эти проблемы решаются строгостью типизации.

А с sun'ом будет так, как его API скажет. Скажет API, что надо залочить sun, чтобы добраться до метода does_sun_shines_now, значит ты не сможешь вызвать этот метод, не залочив sun. И это можно сделать через лямбду, но можно и так -- запросив объект соответствующий залоченному Солнцу, и работая с ним с императивном стиле. Но это будет зависеть от API: как его разработчик решит делать, так и будет.

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

198. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 22-Ноя-21, 14:28 
> Взять к примеру PathBuf:
> fn make_directories(prefix: &str) -> Result<(), io::Error>
>     let mut pathbuf = PathBuf::new();
>     pathbuf.push(prefix);
>     pathbuf.push("bin");
>     // работаем с путём $prefix/bin
>     pathbuf.pop();
>     pathbuf.push("share");
>     // теперь с путём $prefix/share
> }

Вот это хороший пример.

> Это не функционально от слова совсем. Но зато не надо под каждый
> путь выделять свежий кусок памяти из кучи.

Это можно очень похоже написать на языке OCaml, который несомненно функциональный.

Если не вдаваться в дебри функций как first-class citizen, которые мало кому (включая меня) понятны, то:
1. признак императивности - наличие оператора, который даёт команду "верни результат". В Си это return.
2. признак функциональности - отсутствие такого оператора, как в функции с урока математики f(x) = 5x (и это понятнее людям без профдеформации).

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

> И на фоне этого, раст можно называть функциональным, с императивными элементами, или
> императивным с функциональными элементами... Как угодно, но эти названия ничего не
> значат.

Это в теории. На практике кто-то привык писать на императивном языке, ему говорят: "посмотри, вот замена, будет меньше ошибок". Человек смотрит, увиденное в шаблон не укладывается и возникает реакция "да нафик мне эти проверки от переполнения буфера". При этом например мне понятно, что чистые функции позволяют избежать более серьёзных проблем.

> Они бессмысленны совершенно, они свидетельствуют лишь о том, что развитие
> языков выросло из детских штанишек классификаций языков, а взрослую классификацию ещё
> не сшили.

По-моему классификация по признаку "более лучший Х" это вообще уровень пелёнок, скатывающий обсуждения к срачам и синтаксису.

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

199. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Урри (ok), 22-Ноя-21, 15:33 
Не смешивай буль и бит. Это разные сущности.

А второе элементарно решается с помощью #define bool _Bool или даже typedef _Bool bool;

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

95. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +2 +/
Сообщение от ng (ok), 20-Ноя-21, 12:42 
> по стандарту ложное значение 0, истинное не 0.

Почему-то многие это обстоятельство упускают из вида

Основные философские положения классического "C":
1. Всё - есть int ( арифметика с указателями );
2. Всё, отличное от лжи, - истина ( TRUE != 0 );
3. Инициализация переменных в зоне ответственности программиста.

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

char * pStr = NULL;

// < ... >

// исключается раскрытие и проверка *pStr, если pStr == NULL ( pStr == FALSE )
if ( pStr && *pStr )
{
    // что-то делаем, если длина строки больше 0 ( строка не равна "" )
}

Ну, и классический пример - безопасное копирование одной строки в другую без затрат на проверку указателей и размерностей массивов.
#include <stdio.h>

int main()
{
    char pSrc[] = "Hello world!";
    char pDst[ sizeof pSrc ];
    
    char *ps = pSrc;
    char *pd = pDst;

    while ( *pd++ = *ps++ );

    puts( pDst );

    return 0;
}

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

102. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от Аноним (102), 20-Ноя-21, 13:58 
> Ну, и классический пример - безопасное копирование одной строки в другую

только в хеловорлде оно безопасно

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

111. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от ng (ok), 20-Ноя-21, 14:17 
> только в хеловорлде оно безопасно

Эмоциональное замечание - читаем бездоказательное замечание.

:-)

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

117. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 20-Ноя-21, 14:51 
Ну вообще там два копирования, следующий вариант скомпилируется в ряде случаев 1 в 1 с исходным

    int main()
    {
        char pSrc[] = "Hello world!";
        char pDst[] = "Hello world!";

        puts( pDst );

        return 0;
    }


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

131. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от ng (ok), 20-Ноя-21, 16:51 
>  Ну вообще там два копирования, следующий вариант скомпилируется в ряде случаев 1 в 1 с исходным

В исходном примере Одно копирование и Одна инициализация

Пожалуйста, слегка модифицированный код, где Одно копирование и Две инициализации, остальной код без изменений.

int main()
{
    char pSrc[] = "Hello world!";
    char pDst[ sizeof pSrc ] = { 0 };
    
    char *ps = pSrc;
    char *pd = pDst;

    while ( *pd++ = *ps++ );

    puts( pDst );

    return 0;
}

P.S>
Согласен, все три примера ( исходный, модифицированный и Ваш ) выводят идентичный результат на консоль.

Но, в Вашем примере нет показательной арифметики с указателями и границами массивов.

Это путает неофитов, слабо знакомых с основами "C". Оно Вам надо?

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

156. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 21-Ноя-21, 11:16 
>>  Ну вообще там два копирования, следующий вариант скомпилируется в ряде случаев 1 в 1 с исходным
> В исходном примере Одно копирование и Одна инициализация

А char *ps = pSrc; не инициализация? Копирование как таковое вроде в Си не определено. Я имел ввиду, что char pSrc[] имеет automatic storage duration, стало быть инициализируется посредством копирования данных. Чего можно было бы избежать.

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

160. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от ng (ok), 21-Ноя-21, 12:06 
> стало быть инициализируется посредством копирования данных. Чего можно было бы избежать.

Общее != частное.

Физика изучает "идеальный газ", представляемый бесконечно малыми и абсолютно упругими шариками. Все знают, что в натуральный газ устроен иначе. Однако, инженеры двигают прогресс, полагаясь на математические модели, основанные на понятии "идеального газа".

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

В последнем оскорбительного нет. "Детская болезнь" неофита сама проходит с опытом. Опытный программист характеризуется умением разделять общее и частное. Зачем тогда нам требовать от ледокола ровной кромки льда?


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

161. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 21-Ноя-21, 12:14 
Я не понял, при чём тут газ и лёд, и когда проходят болезни неофитов. Вон в соседней ветке (после #88) "ведущий разработчик" операционной системы плавает в теме storage duration.
Ответить | Правка | Наверх | Cообщить модератору

162. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от ng (ok), 21-Ноя-21, 12:33 
> Я не понял, при чём тут газ и лёд, и когда проходят болезни неофитов.

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

:-)

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

163. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 21-Ноя-21, 12:56 
Так вот общий случай - это работа с памятью. Частный случай - копирование. Перед тем как что-то куда-то копировать, хорошо бы понимать, какие бывают типы storage.
Ответить | Правка | Наверх | Cообщить модератору

106. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Аноним (-), 20-Ноя-21, 14:03 
>  позволяет писать лаконичный и безопасный код:

"Халва, халва, халва, ... хм, чей-то во рту все еще не сладко - наверное недостаточно усердно повторял".

> Ну, и классический пример - безопасное копирование одной строки в другую без
> затрат на проверку указателей и размерностей массивов.
> #include <stdio.h>

ЧСХ - "безопасТно" оно только в таком вот хелловроте,
а в реальности, отсутсвие размерности не позволит компилятору ускорить копирование в несколько раз векторизацией. Зато сэкономили "на спичках"^W проверку - да, это классический пример.

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

112. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от Аноним (-), 20-Ноя-21, 14:22 
> а в реальности, отсутсвие размерности не позволит компилятору ускорить копирование в несколько раз векториза

Что ты такое несешь ?! O_O

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

121. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от Аноним (-), 20-Ноя-21, 15:06 
>> а в реальности, отсутствие размерности не позволит компилятору ускорить копирование в несколько раз векториза
> Что ты такое несешь ?! O_O

Зачем ты лезешь в обсуждение, не зная основ?


        movaps  xmm0, xmmword ptr [rip + .L__const.main.pSrc+16]
        movaps  xmmword ptr [rbp - 32], xmm0
        movaps  xmm0, xmmword ptr [rip + .L__const.main.pSrc]
        movaps  xmmword ptr [rbp - 48], xmm0

vs.

.L2:
        movzx   edx, BYTE PTR [rsi+rax]
        mov     BYTE PTR [rcx+rax], dl
        add     rax, 1
        test    dl, dl
        jne     .L2


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

154. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от ng (ok), 21-Ноя-21, 10:18 
>>  позволяет писать лаконичный и безопасный код:
> "Халва, халва, халва, ... хм, чей-то во рту все еще не сладко
> - наверное недостаточно усердно повторял".

Иногда лучше реально жевать, чем об этом говорить, когда нечего сказать.

Вероятно, дело в другом:
Джуниоры выбирают сладкий смузи. Однако, здесь для тех, кто уже предпочитает виски со льдом в ущерб приторной содовой.

> а в реальности, отсутсвие размерности не позволит компилятору ускорить копирование в несколько
> раз векторизацией.

В реальности будет по-взрослому на быстрых функциях memcpy, strcpy и т.п.

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

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

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

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

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

164. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Аноним (-), 21-Ноя-21, 12:57 
> Иногда лучше реально жевать, чем

чем сначала приводить "пример - безопасТное копирование строки", а затем придумывать отмазки ...

> Джуниоры выбирают сладкий смузи
> виски со льдом в ущерб приторной содовой.
> В реальности будет по-взрослому на быстрых функциях memcpy, strcpy и т.п.
> Прошу заметить, что понятия "лаконичность" и "безопасность" относятся к стилю кодирования
> программ, исключая отдельные операторы или функции.
> Наивно полагаясь на оптимизацию компилятора, джуниор просто перекладывает свою ответственность
> на других программистов, создавших компилятор.

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

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

194. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от ng (ok), 22-Ноя-21, 12:25 
> То, что ты очередной опеннетный теоретик-балабол, стало понятно еще из предыдущего примера,
> не нужно подтверждать это почетное звание еще раз ...

Юпитер, ты злишься, а значит ты не прав.

:-)

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

114. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от n00by (ok), 20-Ноя-21, 14:37 
>> по стандарту ложное значение 0, истинное не 0.
> Почему-то многие это обстоятельство упускают из вида

Потому что такого обстоятельства нет. На уровне АЛУ (процессора) есть флаги (нуля, переноса), они принимают два значения: 0 или 1. Из чего и следуют требования стандарта к типу _Bool и вольная интерпретация "истинное не 0" (т.е. человек интуитивно представляет себе результат сравнения достаточно хорошо для многих случаев, но в железе всё малость иначе).

> Основные философские положения классического "C":
> 1. Всё - есть int ( арифметика с указателями );
> 2. Всё, отличное от лжи, - истина ( TRUE != 0 );

На уровне железа результаты команд сравнения не хранятся в регистрах общего назначения, соответственно не имеют тип int. Современный стандарт Си абстрагируется от флагов, но определяет результат конверсии целого в тип _Bool как эквивалент Zero Flag. А в "классическом Си" никакого TRUE не было.

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

137. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от ng (ok), 20-Ноя-21, 18:12 
> А в "классическом Си" никакого TRUE не было.

Согласен, ибо "всё есть int", включая указатели. :-)

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

135. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от Ordu (ok), 20-Ноя-21, 17:22 
> if ( pStr && *pStr )

За венгерскую нотацию полагается стерилизация, чтобы избежать распространения вредоносных мутаций ДНК.

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

139. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от Аноним (31), 20-Ноя-21, 18:47 
> За венгерскую нотацию полагается стерилизация, чтобы избежать распространения вредоносных мутаций ДНК.

как, по-вашему, правильнее:

if (the_pointer_to_the_string_with_our_QR_code_data && *the_pointer_to_the_string_with_our_QR_code_data) ...

или

// тут мы проверяем указатель на строку, в которой хранятся данные QR-кода
if (p && *p)

?

и чем вам не угодил лаконичный pStr?
мешают вашим алгоритмам вычислять смысл содержимого?

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

151. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от Ordu (ok), 21-Ноя-21, 03:34 
>> За венгерскую нотацию полагается стерилизация, чтобы избежать распространения вредоносных мутаций ДНК.
> как, по-вашему, правильнее:
> if (the_pointer_to_the_string_with_our_QR_code_data && *the_pointer_to_the_string_with_our_QR_code_data)
> ...

Что ты бред несёшь? В C не бывает "string", только "pointer to string". Зачем вообще это писать сокращённо или развёрнуто, если это и так ясно? Назови переменную qr, и этого за глаза и за уши хватит.

> и чем вам не угодил лаконичный pStr?

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

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

173. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Урри (ok), 21-Ноя-21, 19:01 
> Назови переменную qr, и этого за глаза и за уши хватит.

Я бы за qr уши оторвал. Вместе с пальцами.

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

182. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Ordu (ok), 21-Ноя-21, 22:44 
>> Назови переменную qr, и этого за глаза и за уши хватит.
> Я бы за qr уши оторвал. Вместе с пальцами.

Почему? Короткое и описательное имя переменной. Вот если у тебя в коде полсотни таких переменных, то пальцы надо оторвать, но не за qr, а за полсотни переменных.

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

157. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от n00by (ok), 21-Ноя-21, 11:22 
> и чем вам не угодил лаконичный pStr?

Префикс p в Венгерке означает указатель, а не массив.

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

140. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от ng (ok), 20-Ноя-21, 18:58 
>> if ( pStr && *pStr )
> За венгерскую нотацию полагается стерилизация, чтобы избежать распространения вредоносных
> мутаций ДНК.

О трудах агронома Трофима Лысенко слышал, но не изучал. Селекция видов - не мой бизнес.

Допуская, что разведение верблюдов - ответственное дело, буду признателен за демонстрацию влияния способа именования переменных на семантику условного оператора из примера.
:-)

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

94. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +3 +/
Сообщение от Аноним (31), 20-Ноя-21, 12:25 
> Почему бы алгоритму этот смысл не вычислить?
> Нет, не исключена. В C enum может содержать _любое_ значение.

У вас нет опыта разработки.

Если разработчик может допустить "_любое_" значение в переменных, имеющих конкретный смысл и конкретный спектр принимаемых значений, то он немедленно признаётся профнепригодным и увольняется.

Потому что источником неверных и некорректных значений может быть только внешняя среда -- пользователь, некорректные настройки, etc. -- "_любое_" значение может прийти только отсюда.
Именно эти значения проверяются и исправляются, когда возможно.
Если "_любые_" значения появляются в других местах, значит программа генерирует неверные значения и работать корректно не может в принципе.

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


Если вы считаете, что алгоритмы должны сами "вычислять смысл", то программирование -- это не ваша сфера.

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

99. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от Аноньимъ (ok), 20-Ноя-21, 13:20 
>Поэтому любой нормальный программист пишет код так, чтобы при малейшей ошибке, возникающей по вине внутренних переменных, программа упала сразу и со сброшенным на диск дампом.
>Потому что источником неверных и некорректных значений может быть только внешняя среда -- пользователь, некорректные настройки, etc. -- "_любое_" значение может прийти только отсюда. Именно эти значения проверяются и исправляются, когда возможно.
>Если "_любые_" значения появляются в других местах, значит программа генерирует неверные значения и работать корректно не может в принципе.

Так, а как ТАК пишут код чтобы программа СРАЗУ упала при ошибке во внутренних переменных без проверок этих внутренних значений на корректность?

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

120. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  –1 +/
Сообщение от Аноним (31), 20-Ноя-21, 15:05 
Ну, например, если передать NULL в dest в strcpy(), то будет ошибка сегментации и работать ничего не будет.
Если наша программа такова, что dest -- при корректной работе проги -- не может быть нулевым, то некорректную работу мы увидим сразу.

А если strcpy() не упадёт, а каким-то образом скажет "ОШИБКА: у вас в dest передан NULL, копирование невозможно", то возникнет сразу пачка проблем:

1. Программа продолжит работать, хотя часть её -- копирование -- не было выполнено;
   смысла в таком продолжении нет, потому что данные уже некорректны.
   Поэтому программа упадёт где-то в другом месте, и вам придётся основательно шерстить код, чтобы найти первопричину.

   И ещё худший вариант: программа не упадёт, а испортит какие-то данные или недовыполнит какого-то действия, а вы этого не заметите;

2. Если вывод будет проводиться в stderr/stdout, то тоже проблема: многие процессы не имеют потока вывода и никто сообщения не увидит.
   У многих других объём вывода такой, что сообщения никто не заметит.

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

3. Если вывод происходит в системный лог, например, то само использование strcpy() будет тянуть за собой какой-нибудь syslog -- совершенно неадекватное усложнение при возможности просто упасть.
   И это также не исключает сценария первого пункта.

Поэтому программа при _внутренних_ ошибках -- зависящих _только_ (подчёркиваю подчёркиваниями) от устройства программы и ни от чего больше -- должна упасть сразу.
Это сэкономит вам время во время отладки.

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

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

122. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Аноним (31), 20-Ноя-21, 15:08 
Пример с NULL в strcpy(), ессно, слишком толстый.
Но он примерно показывает суть, когда надо падать, а когда -- проверять, корректировать или штатно завершать работу с кодом ошибки.
Ответить | Правка | Наверх | Cообщить модератору

124. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от Аноньимъ (ok), 20-Ноя-21, 15:15 
>Поэтому программа при _внутренних_ ошибках -- зависящих _только_ (подчёркиваю подчёркиваниями) от устройства программы и ни от чего больше -- должна упасть сразу.

А она знает что она должна упасть?

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

100. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +1 +/
Сообщение от Ordu (ok), 20-Ноя-21, 13:42 
> Если разработчик может допустить "_любое_" значение в переменных, имеющих конкретный смысл
> и конкретный спектр принимаемых значений, то он немедленно признаётся профнепригодным
> и увольняется.

Хахахаха. Это ты так троллить пытаешься?

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

107. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +2 +/
Сообщение от _kp (ok), 20-Ноя-21, 14:06 
>> нормальный программист пишет код так, чтобы при малейшей ошибке,
>> возникающей по вине внутренних переменных, программа упала сразу и со сброшенным на диск дампом.

Да ну? :)

Оглянитесь. Вне поделок на десктопе такое не допустимо. Автомобили, промышленное оборудование, авиация, и даже банальная водокачка, программ "падальщиков" не потерпят. А ещё удивитесь, что есть ГОСТ'ы, в которых написано, как правильно должно быть, в целом. Более того отдельно оговорено поведение не то что если "переменные испортились", но и если их намеренно испортили.

Логи и дампы можете делать какие угодно, но ошибки надо обрабатывать.

Ошибки и иные внештатные ситуации, обрабатываются как обычно, как реакция на изменение переменных и действия пользователя. Как обрабатываются, другой вопрос, но в любом случае, что бы минимизировать возможный ущерб, и поскорее восстановить работоспособность. То что программно нерешаемо, дополняется аппаратными средствами.

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

113. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Аноним (31), 20-Ноя-21, 14:33 
Вы путаете падения релизов с падениями некорректных сборок и падениями дебажных версий -- все эти падения сильно разные.

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

Падения релизов не допустимы -- это косяк разработчиков.

А падения дебажных версий очень полезны -- это процесс разработки.

Так вот тут речь идёт именно о дебажных версиях: если проект серьёзный и ошибку не заметят ни ваши тестеры, ни контрольная группа предзаказчиков, то после поступления продакшн -- когда ошибка проявится и клиентура потеряет деньги/данные/etc. -- проблема у вас будет вне зависимости от обработки ошибки.


Поэтому правило примерно такое:

0. если ошибка возникает внутри кода по вине программистов, она обрабатывается программистами на этапе отладки: отыскивается и устраняется;

1. если ошибка _может_ возникнуть вне кода -- по вине пользователей, админов, etc. -- тогда она обрабатывается: значения проверяются на допустимые, и если они не корректны, то либо выдаётся сообщение об ошибке и работа завершается, либо каким-то образом значения корректируются, либо сбрасываются на предыдущие или дефолтные;

2. если ошибки возможны из-за неверной сборки, то все требования по сборке должны быть правильно описаны, а скриптам сборки следует в должной степени проводить все нужные проверки (задача это сложная, с плясками с бубном и трёхэтажными заклинаниями, косяки тут весьма вероятны).

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

136. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +2 +/
Сообщение от _kp (ok), 20-Ноя-21, 17:58 
> Падения релизов не допустимы -- это косяк разработчиков.

В идеале, но это не значит, что сбои не возникнут, не смотря на все старания и тесты.


> 1. если ошибка _может_ возникнуть вне кода -- по вине пользователей, админов,

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

> .. значения проверяются на допустимые, и если они не корректны, то либо
> выдаётся сообщение об ошибке

(пишем в лог, сообщаем на сервер поддержки..)

> и работа завершается,

Вам бы для промышленности что то написать, а ещё лучше для авиации. Или просто обдумать работу подобного ПО.

> либо каким-то образом значения корректируются, либо сбрасываются на предыдущие или дефолтные

Так ИНОГДА совсем нельзя. Последствия какие будут?
Операция не отработала, возник сбой, смотрим на что он влияет, оцениваем важность, смотрим сколько у нас времени на реакцию, включаем блокировки, логгируем, действуем согласно ТУ.
А важные значения при передаче еще штампами времени и валидности сопровождают, и фиктивные или устаревшие значения могут быть отброшены в другом модуле, и есть шансы получить ужасные последствия.

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

138. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Аноним (31), 20-Ноя-21, 18:38 
ещё раз: у вас речь идёт о падениях релизов;
речь про core dumped идёт в отношении дебажных версий;


> Так ИНОГДА совсем нельзя. Последствия какие будут?

вот об этом была и речь:

>> Падения релизов не допустимы

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

174. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Урри (ok), 21-Ноя-21, 19:11 
> А падения дебажных версий очень полезны -- это процесс разработки.

Нет.

> Так вот тут речь идёт именно о дебажных версиях: если проект серьёзный
> и ошибку не заметят ни ваши тестеры, ни контрольная группа предзаказчиков,

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

Программа НЕ ДОЛЖНА НИКОГДА падать. Это закон. Любое падение - ЧП и обязано быть рассмотрено в отдельном порядке.

Сходите на полгодика в автомотив поработать, наберетесь неоценимого опыта.

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

146. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от Прохожий (??), 21-Ноя-21, 01:10 
>Если разработчик может допустить "_любое_" значение в переменных, имеющих конкретный смысл и конкретный спектр принимаемых значений

Ох уж этот мне юношеский максимализм. Давно в профессии? Подозреваю, что год-два, не более, раз такую ахинею несёшь.

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

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

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

185. "Выпуск ControlFlag 1.0, инструмента для выявления ошибок в к..."  +/
Сообщение от _kp (ok), 21-Ноя-21, 23:28 
> следует похоронить и забыть, как о страшном сне.

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

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

Ну бывает, вроде бы и язык новый, а проблемы старые.

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

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

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




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

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