Философия ASSERT-а
От: Дарней Россия  
Дата: 06.12.05 07:18
Оценка: +2 -3
Здравствуйте, Alex Fedotov, Вы писали:

AF>ASSERT проверяет условие, которое истинно всегда.


если условие истинно всегда, то его нет смысла проверять
assert проверяет условия, которые программист предполагает всегда истинными
... << RSDN@Home 1.1.4 stable rev. 510>>

13.12.05 05:04: Ветка выделена из темы Почему нельзя отключать ASSERT-ы в релизе
Автор: Сергей Губанов
Дата: 05.12.05
— VladD2
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[7]: Философия ASSERT-а
От: Павел Кузнецов  
Дата: 06.12.05 07:30
Оценка: +1 -1
Дарней,

> AF> ASSERT проверяет условие, которое истинно всегда.

>
> если условие истинно всегда, то его нет смысла проверять

В отладке? Имеет.

> assert проверяет условия, которые программист предполагает всегда истинными


И что будет делать пользователь, если программист ошибся?
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[8]: Философия ASSERT-а
От: Дарней Россия  
Дата: 06.12.05 08:11
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

>> если условие истинно всегда, то его нет смысла проверять


ПК>В отладке? Имеет.


какая еще отладка, если условие истинно "всегда"?
Хинт: если из-за бага в другом модуле произошел проход по памяти, то оно тоже всегда будет истинным?

>> assert проверяет условия, которые программист предполагает всегда истинными


ПК>И что будет делать пользователь, если программист ошибся?


задирать лапки и идти обрывать телефон. Ну, или ожесточенно писать отчет для техсаппорта. А что, есть еще варианты?
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[7]: Философия ASSERT-а
От: minorlogic Украина  
Дата: 06.12.05 08:49
Оценка: +2 -1
Здравствуйте, Дарней, Вы писали:

Д>Здравствуйте, Alex Fedotov, Вы писали:


AF>>ASSERT проверяет условие, которое истинно всегда.


Д>если условие истинно всегда, то его нет смысла проверять

Д>assert проверяет условия, которые программист предполагает всегда истинными

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

Опять же например если некто затер память которую вы используете ( стек и т.д.) восстановиться от этой ошибки не представляется возможным НИКАКИМИ проверками , а можно лишь дать операционной системе исполнить свою грязную работу и завершить исполнение.

Как правильно написали уже , если вы предоставляете внешний интерфейс к библотеке ТО НЕЛЬЗЯ проверять валидность входящих параметров assert.
assert может использоваться только для проверок аргументов внутри библиотеки , чтобы контролировать процесс разработки.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[8]: Философия ASSERT-а
От: Дарней Россия  
Дата: 06.12.05 09:15
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Не предполагает, а уверен в истинности


и в чем же разница?
просто очень хотелось что-нибудь возразить?

M>Опять же например если некто затер память которую вы используете ( стек и т.д.) восстановиться от этой ошибки не представляется возможным НИКАКИМИ проверками , а можно лишь дать операционной системе исполнить свою грязную работу и завершить исполнение.


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

M>Как правильно написали уже , если вы предоставляете внешний интерфейс к библотеке ТО НЕЛЬЗЯ проверять валидность входящих параметров assert.


вообще-то говоря, изначально речь не шла о проверке ВНЕШНИХ параметров
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[9]: Философия ASSERT-а
От: minorlogic Украина  
Дата: 06.12.05 09:30
Оценка: +5 -1
Здравствуйте, Дарней, Вы писали:

Д>Здравствуйте, minorlogic, Вы писали:


M>>Не предполагает, а уверен в истинности


Д>и в чем же разница?

Д>просто очень хотелось что-нибудь возразить?

Нет , есть принципиальное различие которое просто многие не видят. Если сработал assert это означает что НЕПРАВИЛЬНО НЕ ВЫПОЛНЕНИЕ программы , а сама ПРОГРАММА — НЕПРАВИЛЬНА в ней есть баги которые надо устранить как можно раньше.

M>>Опять же например если некто затер память которую вы используете ( стек и т.д.) восстановиться от этой ошибки не представляется возможным НИКАКИМИ проверками , а можно лишь дать операционной системе исполнить свою грязную работу и завершить исполнение.


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

И ? вы знаете способ борьбы с тем что ктото по стеку прошелся ? поделитесь !

M>>Как правильно написали уже , если вы предоставляете внешний интерфейс к библотеке ТО НЕЛЬЗЯ проверять валидность входящих параметров assert.


Д>вообще-то говоря, изначально речь не шла о проверке ВНЕШНИХ параметров


Ок еще раз бодрезюмирую , assert служит для проврки программиста и правильности программы , а не правильности использования или правильности параметров. Как только кто то пытается использовать асерты не по назначению , сразу вырастает куча проблем и советы типа "нельзя отключать даже в релизе".
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[10]: Философия ASSERT-а
От: Дарней Россия  
Дата: 06.12.05 10:40
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>>>Не предполагает, а уверен в истинности


Д>>и в чем же разница?

Д>>просто очень хотелось что-нибудь возразить?

M>Нет , есть принципиальное различие которое просто многие не видят. Если сработал assert это означает что НЕПРАВИЛЬНО НЕ ВЫПОЛНЕНИЕ программы , а сама ПРОГРАММА — НЕПРАВИЛЬНА в ней есть баги которые надо устранить как можно раньше.


объясни мне, какое отношение это имеет к исходному утверждению?

M>И ? вы знаете способ борьбы с тем что ктото по стеку прошелся ? поделитесь !


if (!(это-условие-должно-быть-всегда-верно)) abort();

M>Ок еще раз бодрезюмирую , assert служит для проврки программиста и правильности программы , а не правильности использования или правильности параметров.


shit, как известно, happens. И ему все равно, дебаг у тебя или релиз.
поэтому в релизе надо точно так же оставлять проверки на случаи, которые "не должны произойти никогда"
а как их назвать — это дело десятое
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[7]: Философия ASSERT-а
От: Mamut Швеция http://dmitriid.com
Дата: 06.12.05 13:54
Оценка: 2 (2) :)
AF>>ASSERT проверяет условие, которое истинно всегда.

Д>если условие истинно всегда, то его нет смысла проверять

Д>assert проверяет условия, которые программист предполагает всегда истинными

Erlang Programming Rules and Conventions

3.13 Do not program "defensively"

A defensive program is one where the programmer does not "trust" the input data to the part of the system they are programming. In general one should not test input data to functions for correctness. Most of the code in the system should be written with the assumption that the input data to the function in question is correct. Only a small part of the code should actually perform any checking of the data. This is usually done when data "enters" the system for the first time, once data has been checked as it enters the system it should thereafter be assumed correct.

... << RSDN@Home 1.2.0 alpha rev. 619>>


dmitriid.comGitHubLinkedIn
Re[8]: Философия ASSERT-а
От: Дарней Россия  
Дата: 07.12.05 04:59
Оценка: :)
Здравствуйте, Mamut, Вы писали:

M>Erlang Programming Rules and Conventions

M>

3.13 Do not program "defensively"

M>A defensive program is one where the programmer does not "trust" the input data to the part of the system they are programming. In general one should not test input data to functions for correctness. Most of the code in the system should be written with the assumption that the input data to the function in question is correct. Only a small part of the code should actually perform any checking of the data. This is usually done when data "enters" the system for the first time, once data has been checked as it enters the system it should thereafter be assumed correct.


очень интересно

но не все же на Эрланге пишут
если язык наводнен опасными конструкциями и библиотечными функциями, как например C/C++ — другого выхода не остается, кроме как пихать везде ассерты
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[9]: Философия ASSERT-а
От: Mamut Швеция http://dmitriid.com
Дата: 07.12.05 07:30
Оценка:
Д>очень интересно

Д>но не все же на Эрланге пишут

Д>если язык наводнен опасными конструкциями и библиотечными функциями, как например C/C++ — другого выхода не остается, кроме как пихать везде ассерты

Да я тоже на нем не пишу Но, имхо, вот там правильно сказано:

Only a small part of the code should actually perform any checking of the data. This is usually done when data "enters" the system for the first time, once data has been checked as it enters the system it should thereafter be assumed correct.


Потому что иначе параноиком можно стать
... << RSDN@Home 1.2.0 alpha rev. 619>>


dmitriid.comGitHubLinkedIn
Re[10]: Философия ASSERT-а
От: Дарней Россия  
Дата: 07.12.05 08:15
Оценка:
Здравствуйте, Mamut, Вы писали:

M>

Only a small part of the code should actually perform any checking of the data. This is usually done when data "enters" the system for the first time, once data has been checked as it enters the system it should thereafter be assumed correct.


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

M>Потому что иначе параноиком можно стать


я когда на плюсах писал, замечал за собой такое — даже за пределами работы
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[10]: Философия ASSERT-а
От: Cyberax Марс  
Дата: 07.12.05 12:00
Оценка: +1
Mamut wrote:

> Потому что иначе параноиком можно стать


Для программиста может быть и полезно...

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[11]: Философия ASSERT-а
От: Mamut Швеция http://dmitriid.com
Дата: 08.12.05 10:09
Оценка:
Д>мне еще понравилось про разделение рабочего кода и обработки ошибок
Д>хотя не совсем понятно, как это у них выглядит

Erlang's Exception Handling Revisited
... << RSDN@Home 1.2.0 alpha rev. 619>>


dmitriid.comGitHubLinkedIn
Re[11]: Философия ASSERT-а
От: minorlogic Украина  
Дата: 09.12.05 08:54
Оценка:
Здравствуйте, Дарней, Вы писали:

M>>Нет , есть принципиальное различие которое просто многие не видят. Если сработал assert это означает что НЕПРАВИЛЬНО НЕ ВЫПОЛНЕНИЕ программы , а сама ПРОГРАММА — НЕПРАВИЛЬНА в ней есть баги которые надо устранить как можно раньше.


Д>объясни мне, какое отношение это имеет к исходному утверждению?


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

M>>И ? вы знаете способ борьбы с тем что ктото по стеку прошелся ? поделитесь !


Д>if (!(это-условие-должно-быть-всегда-верно)) abort();


Э.... рекомендовал бы подумать еще над этим т.е. например if(object->is_valid()) очень поможет если указатель на object потерт ....

M>>Ок еще раз бодрезюмирую , assert служит для проврки программиста и правильности программы , а не правильности использования или правильности параметров.


Д>shit, как известно, happens. И ему все равно, дебаг у тебя или релиз.

Д>поэтому в релизе надо точно так же оставлять проверки на случаи, которые "не должны произойти никогда"
Д>а как их назвать — это дело десятое

Особенно полезно оставлять в релизе проверки типа assert(sizeof(int) == 32) ; и т.д.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[12]: Философия ASSERT-а
От: Дарней Россия  
Дата: 09.12.05 09:25
Оценка:
Здравствуйте, minorlogic, Вы писали:

M>Э.... рекомендовал бы подумать еще над этим т.е. например if(object->is_valid()) очень поможет если указатель на object потерт ....


в худшем случае, is_valid вернет true и тогда просто ничего не произойдет.
а если произойдет GPF, то это тоже неплохо. Во всяком случае, программа не будет продолжать исполнение.

M>Особенно полезно оставлять в релизе проверки типа assert(sizeof(int) == 32) ; и т.д.


неважно, дебаг или релиз. Проверять такие вещи в рантайме — это вообще моветон.
... << RSDN@Home 1.1.4 stable rev. 510>>
Всех излечит, исцелит
добрый Ctrl+Alt+Delete
Re[8]: Почему нельзя отключать ASSERT-ы в релизе
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.12.05 02:16
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>И что будет делать пользователь, если программист ошибся?


Напишет дружественно письмо программисту.
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: Почему нельзя отключать ASSERT-ы в релизе
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.12.05 02:16
Оценка: :))
Здравствуйте, minorlogic, Вы писали:

M>Нет , есть принципиальное различие которое просто многие не видят. Если сработал assert это означает что НЕПРАВИЛЬНО НЕ ВЫПОЛНЕНИЕ программы , а сама ПРОГРАММА — НЕПРАВИЛЬНА в ней есть баги которые надо устранить как можно раньше.


Хм. А не значит ли это, что программист ошибся в своей уверенности?

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

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

ЗЫ

В общем, предлагаю выяснить куда более актуальную проблему. Есть ли право на лево?
... << RSDN@Home 1.2.0 alpha rev. 620>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: Почему нельзя отключать ASSERT-ы в релизе
От: minorlogic Украина  
Дата: 13.12.05 09:01
Оценка: +1
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, minorlogic, Вы писали:


M>>Нет , есть принципиальное различие которое просто многие не видят. Если сработал assert это означает что НЕПРАВИЛЬНО НЕ ВЫПОЛНЕНИЕ программы , а сама ПРОГРАММА — НЕПРАВИЛЬНА в ней есть баги которые надо устранить как можно раньше.


VD>Хм. А не значит ли это, что программист ошибся в своей уверенности?


Так в том то и дело что именно ПРОГРАММИСТ ошибся. А не сработал ответ на штатную ситуацию (подсунули неправильные параметры).


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


VD>Утверждения и делаются для того чтобы проверить истенность своих утверждений. Непроверенное утверждение есть предположение. Так что вы все и правы, и не правы одновременно.


Еще один пример assert.

void func(){
bitstream->save( Obj );
assert(Obj == bitstream->LoadObj() ); // совершенно четко видно , что этот код как собаке 5 нога в релизе продукта
// но для отладки строка выше , просто незаменима, проверяет реализацию bitstream и плюс подтверждает , что объект восстановился после записи идентично
}
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[12]: Почему нельзя отключать ASSERT-ы в релизе
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 13.12.05 09:17
Оценка: 2 (1)
Здравствуйте, minorlogic, Вы писали:

M>Еще один пример assert.


M>void func()
M>{
M> bitstream->save( Obj );
M> // совершенно четко видно , что этот код как собаке 5 нога в релизе продукта
M> // но для отладки строка выше , просто незаменима, проверяет реализацию bitstream
M> // и плюс подтверждает , что объект восстановился после записи идентично
M> assert(Obj  == bitstream->LoadObj() );
M>}


Мда уж. Это напомнило мне мой период ассерто-мании, когда я использовал assert для контроля всего и вся. Был один assert, который контролировал корректную работу FK в базе. Так он взял и сработал из-за бага в компиляторе BCB3
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Философия ASSERT-а
От: srggal Украина  
Дата: 13.12.05 09:56
Оценка:
Здравствуйте, Дарней, Вы писали:

Д>Здравствуйте, Alex Fedotov, Вы писали:


AF>>ASSERT проверяет условие, которое истинно всегда.


Д>если условие истинно всегда, то его нет смысла проверять

Д>assert проверяет условия, которые программист предполагает всегда истинными

Я совсем не понял в чем собственно вопрос ?

Но вот assert, как минимум нужно использовать разработчикам библиотек, дабы валидировать праметры функция, ибо не каждый программист сходу читает описание и комментарии, а вот натолкнувшись на assert — будет вынужден этим заняться, причем с благодарностью к автору библиотеки, в противном случае, этот несчастный программист будет погружен на некоторое время ( кол-венная характеристика — сложный интегральный коэффициент, зависящий от многих факторов ), в дебри этой самой библиотекм, и он, будьте увекрены, вспонит всех родственников, да и самого автора библиотеки.
... << RSDN@Home 1.1.4 stable rev. 510>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.