Re[14]: Необходимость ASSERT
От: Gaperton http://gaperton.livejournal.com
Дата: 19.10.05 14:22
Оценка: 4 (4) +4
Здравствуйте, aik, Вы писали:

aik>Но вообще понятно, кто не писал систем 24*7, не поймут как жить без ассертов


Я последние 6 лет пишу "24*7". Могу отвественно заявить, что без ассертов в случае сложной системы ты повесишься. Особенно для достаточно сложной асинхронной системы. Синклер тебе написал все правильно. Рекомендую перечитать и подумать.

Примеры использования ассертов, которые ты приводил — очень плохи. У нас в компании подобный код не пройдет инспекцию и будет запрещен к чекину. Основная философия написания отказоустойчивых систем — это let it crash с подробной информацией как можно раньше, с последующим перехватом и обработкой ошибки. Оттягивание обработки ошибочной ситуации и игнорирование (фатальной) ошибки, как у тебя, не дает никакой пользы, кроме следующего вреда:
1) Очень сильно ухудшается читабельность кода. В разы. Что затрудняет сопровождение.
2) При фатальной ошибке прога все равно упадет, но в другом месте, и с такими дикими симптомами, что причину ошибки ты вообще не найдешь. Я говорю, разумеется, о достаточно сложных системах, от полмиллиона строк и выше. А не о микроконтроллерах.

Дополню Синклера — он не договорил до конца. Ассерты применяются для практической реализации техники формальных спецификаций. Упрощенно — она состоит в том, что для функций определяется пара "предусловие" и "постусловие". Пример для сортировки: предусловие — true. постусловие — x[i] <= [i+1] для всех 0 < i < N-1. Вычисление постусловия занимает O(N) времени, и, разумеется, должно быть выкинуто из релиза. В дебаге ошибка через этот assert не пройдет.
Re[16]: Необходимость ASSERT
От: Gaperton http://gaperton.livejournal.com
Дата: 19.10.05 17:21
Оценка: :))) :))) :))
Здравствуйте, aik, Вы писали:

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


aik>>>Но вообще понятно, кто не писал систем 24*7, не поймут как жить без ассертов

G>>Я последние 6 лет пишу "24*7". Могу отвественно заявить, что без ассертов в случае сложной системы ты повесишься. Особенно для достаточно сложной асинхронной системы. Синклер тебе написал все правильно. Рекомендую перечитать и подумать.

aik>Перечитал, и утверждаю что — не повесился.

Что же — подождем!

25 октября 2007 года.

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

— После того, как я в очередной раз предложила ему вставить в программу assert-ы, он закричал на меня и бросил в меня степлером, я едва успела увернуться! — рассказывает тестер Деревянкина.

Милиция считает, что самоубийство произошло из-за пагубного пристрастия погибшего к форумам RSDN...


Re[10]: Необходимость ASSERT
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.10.05 10:37
Оценка: 3 (2) +4
Здравствуйте, aik, Вы писали:
D>>А чем тебе сервера-то не угодили?

aik>Их не видно. А ассерт ставит колом процесс, пока ты по кнопке не жмакнешь. Там вообще правила более жесткие, чтобы лепить даже лишний вывод в лог.

Ты, наверное, какие-то не те ассерты встречал.
Настоящие ассерты:
а) не имеют никакой связи с кнопками. Их обычная функция — вызвать аварийную остановку, при этом гарантируя запись/выдачу соответствующей информации. Отличие от самопроизвольной остановки — именно в наличии этой дополнительной информации
б) обладают способностью автоматически исчезать из релизного кода. Потому, что ассерт — это средство отладки. Его задача не в том, чтобы помочь обработать ошибку в данном коде, а в том, чтобы найти ошибку в коде, который им пользуется.

А про какие ассерты ты говоришь?
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[16]: Необходимость ASSERT
От: Odi$$ey Россия http://malgarr.blogspot.com/
Дата: 19.10.05 16:08
Оценка: 2 (2) +3
Здравствуйте, aik, Вы писали:

aik>>>ASSERT(szFirstName != NULL);

aik>>>if (NULL == szFirstName)
aik>>> return -1;
S>>Не надо так писать. Если у тебя есть нормальный способ обработать ошибку — обрабатывай ошибку. Ассерт здесь не нужен. Ассерт нужен для проверки выполнения договоренностей.

aik>Все не отловишь, значит, все равно надо все проверять, значит, ассерты не так полезны.


ok, еще один рывок, еще одна попытка Срабатывание assert-а означает безусловную необходимость изменения кода (текста программы), вызвавшего его срабатывание. Дружественым if (NULL == szFirstName) return -1; ты ни себя, ни кого другого на изменение кода не нагнешь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568 Windows 2003 5.2.3790.0 >>
Re[13]: Необходимость ASSERT
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 19.10.05 12:08
Оценка: +1 -2
Здравствуйте, Sinclair, Вы писали:

S>В тех местах, где мы не можем гарантировать корректных параметров, вместо ассерта надо писать логику обработки. Примерно так:

S>
S>int RegisterUser(char * szFirstName, char* szLastName)
S>{
S>  ASSERT(szFirstName != NULL); // внещний код обязан передать нам валидный поинтер!
S>  ASSERT(szLastName != NULL);
S>    if(strlen(szLastName) == 0) // а вот тут уже пользовательский ввод
S>    {
S>      return -1; // возвращаем код ошибки, чтобы вызывающий код мог отразить это в интерфейсе
S>    }
S>    return SaveToDb(szFirstName, szLastName);
S>}
S>


Имхо, самая большая проблема ASSERT-ов это то, что они выбрасываются из production кода. Абыдна бывает получать в production ошибку в функции RegisterUser (или даже в дебрях SaveToDb) из-за того, что где-то выше один из szFirstName, szLastName получился нулевым. Благодоря ASSERT-ам мы теряем возможность быстро продиагностировать проблему.

А отладить все невозможно. Поэтому и в production системах баги, к сожалению, есть.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[12]: Необходимость ASSERT
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.10.05 11:59
Оценка: +2
Здравствуйте, aik, Вы писали:

aik>Аварийная остановка — плохо. У тебя система видео-наблюдения работает или диск пишется — аварийная остановка фатальна.

Гм. Ну так, друг любезный, надо ее отлаживать, значит. До того, как она в продакшн попадет. А не после того.
aik>Вот сейчас с фирмварью вожусь — ну куда там ассертить?
Туда же, надо полагать. Или ты без эмулятора работаешь?
aik>Это power management controller, он повиснет — дорогой, очень дорогой телекомный ящик встанет колом и целая деревня без телефонов сидеть будет, например. Там и аварийно остановиться нельзя даже.
Ну и я об чем? Ассерт применяется примерно так:
void SetData(MyStr* struct, Data* data)
{
  ASSERT(struct!= NULL, "ERROR: Null value passed to setData!");
    struct->Field1 = data;
}

без ассерта твоя прога сдампится на следующей же строке. Вот только на этот раз никакой информации не останется.
Поэтому сначала пишется отладочный код, утыканный ассертами в тех местах, где есть неявные договоренности (т.е. все те договоренности, которые не может проверить компилятор).
В тех местах, где мы не можем гарантировать корректных параметров, вместо ассерта надо писать логику обработки. Примерно так:
int RegisterUser(char * szFirstName, char* szLastName)
{
  ASSERT(szFirstName != NULL); // внещний код обязан передать нам валидный поинтер!
  ASSERT(szLastName != NULL);
    if(strlen(szLastName) == 0) // а вот тут уже пользовательский ввод
    {
      return -1; // возвращаем код ошибки, чтобы вызывающий код мог отразить это в интерфейсе
    }
    return SaveToDb(szFirstName, szLastName);
}

int RegisterUser(char * szFirstName, char* szLastName)
{
  ASSERT(szFirstName != NULL); // внещний код обязан передать нам валидный поинтер!
  ASSERT(strlen(szLastName) != 0); // и длина должна быть ненулевой!
}


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

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

aik>Ну да, и тогда концов не найдешь почему у клиента, например, падает. Ведь у него ж релиз, ассертов нет.

Если тебе условия позволяют развернуть обратную связь с клиентом — отдавай ему обассерченную версию. Без ассертов-то вообще ничего не получишь, разве что AV/BSOD/core dump...
S>>А про какие ассерты ты говоришь?
aik>Да про всякие
Ну например?
aik>Я веду к тому, что случаи — они разные бывают,
Бывают. Но я пока не встречал случая, в котором бы ассерты были вредны. Так что я пока не вижу оправдания запрету на их использование.

Позволю также себе напомнить, что вопрос про ассерты был поднят в рамках более широкого вопроса — о якобы имеющих место запретах на написание читаемого кода. Можно вернуться к нему и попытаться привести другой пример, более осмысленный.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[13]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 12:16
Оценка: +2
Здравствуйте, Sinclair, Вы писали:

S>int RegisterUser(char * szFirstName, char* szLastName)

S>{
S> ASSERT(szFirstName != NULL); // внещний код обязан передать нам валидный поинтер!
S> ASSERT(szLastName != NULL);
S> if(strlen(szLastName) == 0) // а вот тут уже пользовательский ввод
S> {
S> return -1; // возвращаем код ошибки, чтобы вызывающий код мог отразить это в интерфейсе
S> }
S> return SaveToDb(szFirstName, szLastName);
S>}

Здесь ошибка. Вместо

ASSERT(szFirstName != NULL);

надо писать

ASSERT(szFirstName != NULL);
if (NULL == szFirstName)
return -1;

Так и ассерт не нужен. Везде, всегда проверять коды возвратов. Но, в общем, я описал почему может быть запрет на ассерты, кто хотел — тот понял, кто не хочет понимать — будет упираться. Дальше тему развивать не интересно.
Re[14]: Необходимость ASSERT
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.10.05 12:33
Оценка: +1 -1
Здравствуйте, aik, Вы писали:
aik>Здесь ошибка. Вместо
aik>ASSERT(szFirstName != NULL);
aik>надо писать
aik>ASSERT(szFirstName != NULL);
aik>if (NULL == szFirstName)
aik> return -1;
Не надо так писать. Если у тебя есть нормальный способ обработать ошибку — обрабатывай ошибку. Ассерт здесь не нужен. Ассерт нужен для проверки выполнения договоренностей.
aik>Так и ассерт не нужен. Везде, всегда проверять коды возвратов. Но, в общем, я описал почему может быть запрет на ассерты,
Нет, пока не написал. Ты написал, что ассерты приводят к зависанию до нажатия кнопки. Это, извини, не имеет ничего общего с действительностью, данной мне в ощущениях.
aik>кто хотел — тот понял, кто не хочет понимать — будет упираться.
Ну почему же упираться? Мне правда интересно. Я вот всю жизнь думал, что ассерты есть абсолютное благо. Не знаю ни одной проблемы от использования ассертов. Знаю проблемы от неверного использования ассертов. А тут оказывается, что может быть какой-то вред. Надо срочно узнать, какой именно — иначе я спать спокойно не смогу.
aik>Дальше тему развивать не интересно.
Ну как же, мы ведь только начали!
Дальше мы, я думаю, придем еще к чему-нибудь про читаемость кода. Ну там, к вредности использовать code convention, к запрету на комментарии в исходниках... Что у нас там еще из области догм по поводу читаемости кода есть? Давайте разрушим эти замшелые скрижали.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[17]: Необходимость ASSERT
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 19.10.05 14:14
Оценка: +2
Здравствуйте, minorlogic, Вы писали:

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


Тогда это будет не assert.
Смысл assert-а в том, что он исчезает из кода при компиляции с NDEBUG. Если же в production он остается, значит это не assert, а обычная проверка.
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[10]: Необходимость ASSERT
От: dshe  
Дата: 19.10.05 09:36
Оценка: +1
Здравствуйте, aik, Вы писали:

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


F>>>>>Ого ! Даже интересно как это вас заставляли писать плохо читабельный код ? Не пойму, для чего это понадобилось Это как если бы повару сказали "Приготовь обед так, чтобы посетитель получил расстройство желудка"

M>>>>Бывает и не такое , а как вам требование не использовать assert или похожие макросы ?
aik>>>Нормальное требование. Ассерты в сервере, например — нонсенс.
D>>А чем тебе сервера-то не угодили?

aik>Их не видно. А ассерт ставит колом процесс, пока ты по кнопке не жмакнешь. Там вообще правила более жесткие, чтобы лепить даже лишний вывод в лог.


Так делать их видимыми. Писать в лог, например. Если assert fail'ится, значит, что-то пошло не так. Тут уж дело не до производительности (которую логи могут, вроде бы, понизить). Это может казаться противоестественным, но fail fast подход делает программы более устойчивыми.
--
Дмитро
Re[14]: Необходимость ASSERT
От: LuciferMoscow Россия  
Дата: 19.10.05 12:19
Оценка: +1
Здравствуйте, eao197, Вы писали:

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


M>>>>А идея перенаправить асерты в лог , не пользуется популярностью ?


aik>>>Это не важно. Логи растут, переполняются, забивают винт => сервер лежит.

LM>>Пусть логирующий класс\другой класс сам чистит логи

E>Не, не его это дело. Да и программа может работать на высоком приоритете, когда нельзя из нее запускать какие-то административные действия (типа архивирования логов), либо слишком это геморройно.


E>Меня тут недавно VladD2 спрашивал, что я на Ruby реального делаю Вот как раз последнее, что я делал -- это набор скриптов, которые ищут старые логи и архивируют их, а слишком старые заархивированные логи просто удаляют. Такой скрипт настраивается один раз администратором, запускается, например, через cron и все -- винты всегда остаются сухими и чистыми

Или так. Разница небольшая : места нам хватит
Re[12]: Необходимость ASSERT
От: Cyberax Марс  
Дата: 19.10.05 12:34
Оценка: +1
aik wrote:

> Аварийная остановка — плохо. У тебя система видео-наблюдения работает

> или диск пишется — аварийная остановка фатальна.

А лучше будет, если из-за запорченой памяти система видеонаблюдения
сотрет все записаные данные? Может проще по assert'у намертво остановить
все (с максимальной руганью в лог), а потом перезапустить все по
тайм-ауту watchdog'а.

> Вот сейчас с фирмварью вожусь — ну куда там ассертить? Это power

> management controller, он повиснет — дорогой, очень дорогой телекомный
> ящик встанет колом и целая деревня без телефонов сидеть будет,
> например. Там и аварийно остановиться нельзя даже.

А лучше будет, если вдруг вместо 220 вольт на железку пойдет 110?

--
С уважением,
Alex Besogonov (alexy@izh.com)
Posted via RSDN NNTP Server 2.0 beta
Sapienti sat!
Re[13]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 12:41
Оценка: -1
Здравствуйте, Cyberax, Вы писали:

>> Аварийная остановка — плохо. У тебя система видео-наблюдения работает

>> или диск пишется — аварийная остановка фатальна.
C>А лучше будет, если из-за запорченой памяти система видеонаблюдения
C>сотрет все записаные данные? Может проще по assert'у намертво остановить
C>все (с максимальной руганью в лог), а потом перезапустить все по
C>тайм-ауту watchdog'а.

Как это "все"? Будет долго и упорно удалять файлы с харда? Не, ну все возможно, конечно, но реальнее гораздо незапись индекса в AVI файл (без этого файл — мертвый набор байтов) из-за ассерта, который грохнул процесс и не дал фильтру сбросить индекс.

>> Вот сейчас с фирмварью вожусь — ну куда там ассертить? Это power

>> management controller, он повиснет — дорогой, очень дорогой телекомный
>> ящик встанет колом и целая деревня без телефонов сидеть будет,
>> например. Там и аварийно остановиться нельзя даже.
C>А лучше будет, если вдруг вместо 220 вольт на железку пойдет 110?

36 Микруха, контроллирующая токи, не пропустит такое. Это — хардварный ассерт Но, благодаря неповисшей фирмвари, мы сможем понять что реально напряжение упало и переинитить определенные контроллеры.

Но вообще понятно, кто не писал систем 24*7, не поймут как жить без ассертов
Re[16]: Необходимость ASSERT
От: minorlogic Украина  
Дата: 19.10.05 14:18
Оценка: +1
Не знаю как у вас с асертами а у меня они ничего не грохают . ЭТО ЖЕ МОИ АСЕРТЫ , я им хозян , что скажу то и сделают .

Если мне надо то завалят систему , если нет то в лог чего то запишут.

Как пример , в BCB5 родной стандартный "assert" из рантайма вешал всю среду выполнения . Конечно первое что я сделал , это переписал реализацию макроса "assert".

В общем если он у вас ведет себя не так как вы ожидаете , это ваша проблема
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[17]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 14:23
Оценка: +1
Здравствуйте, minorlogic, Вы писали:

M>Не знаю как у вас с асертами а у меня они ничего не грохают . ЭТО ЖЕ МОИ АСЕРТЫ , я им хозян , что скажу то и сделают .

M>Если мне надо то завалят систему , если нет то в лог чего то запишут.
M>Как пример , в BCB5 родной стандартный "assert" из рантайма вешал всю среду выполнения . Конечно первое что я сделал , это переписал реализацию макроса "assert".
M>В общем если он у вас ведет себя не так как вы ожидаете , это ваша проблема

Это уже нифига не те ассерты, которые мы тут обсуждали. Это твои персональные хэндлеры ошибок, про которые мне вот вообще непонятно что же они в итоге делают.
Re[17]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 16:28
Оценка: +1
Здравствуйте, Odi$$ey, Вы писали:

aik>>>>ASSERT(szFirstName != NULL);

aik>>>>if (NULL == szFirstName)
aik>>>> return -1;
S>>>Не надо так писать. Если у тебя есть нормальный способ обработать ошибку — обрабатывай ошибку. Ассерт здесь не нужен. Ассерт нужен для проверки выполнения договоренностей.
aik>>Все не отловишь, значит, все равно надо все проверять, значит, ассерты не так полезны.
OE>ok, еще один рывок, еще одна попытка Срабатывание assert-а означает безусловную необходимость изменения кода (текста программы), вызвавшего его срабатывание. Дружественым if (NULL == szFirstName) return -1; ты ни себя, ни кого другого на изменение кода не нагнешь.

Частое нагибание весьма часто приведет к замене ASSERT(szFirstName != NULL) на if (NULL == szFirstName) return -1
Re[13]: Необходимость ASSERT
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 21.10.05 10:12
Оценка: :)
Здравствуйте, minorlogic, Вы писали:

M>Супер , примерно так мне и пытались объяснить почему нельзя их использовать ..


M>Асерты — это механизм ОТЛАДКИ ,


Т. е. тебе нельзя отлаживать свой код?
Необходимость ASSERT
От: minorlogic Украина  
Дата: 19.10.05 08:37
Оценка:
Здравствуйте, fplab, Вы писали:

F>Ого ! Даже интересно как это вас заставляли писать плохо читабельный код ? Не пойму, для чего это понадобилось Это как если бы повару сказали "Приготовь обед так, чтобы посетитель получил расстройство желудка"


Бывает и не такое , а как вам требование не использовать assert или похожие макросы ?

19.10.05 17:14: Ветка выделена из темы Почему не все программисты выравнивают код?
Автор: Whistler
Дата: 18.10.05
— AndrewVK
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[7]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 08:40
Оценка:
Здравствуйте, minorlogic, Вы писали:

F>>Ого ! Даже интересно как это вас заставляли писать плохо читабельный код ? Не пойму, для чего это понадобилось Это как если бы повару сказали "Приготовь обед так, чтобы посетитель получил расстройство желудка"

M>Бывает и не такое , а как вам требование не использовать assert или похожие макросы ?

Нормальное требование. Ассерты в сервере, например — нонсенс.
Re[8]: Необходимость ASSERT
От: dshe  
Дата: 19.10.05 09:14
Оценка:
Здравствуйте, aik, Вы писали:

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


F>>>Ого ! Даже интересно как это вас заставляли писать плохо читабельный код ? Не пойму, для чего это понадобилось Это как если бы повару сказали "Приготовь обед так, чтобы посетитель получил расстройство желудка"

M>>Бывает и не такое , а как вам требование не использовать assert или похожие макросы ?

aik>Нормальное требование. Ассерты в сервере, например — нонсенс.


А чем тебе сервера-то не угодили?
--
Дмитро
Re[9]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 09:23
Оценка:
Здравствуйте, dshe, Вы писали:

F>>>>Ого ! Даже интересно как это вас заставляли писать плохо читабельный код ? Не пойму, для чего это понадобилось Это как если бы повару сказали "Приготовь обед так, чтобы посетитель получил расстройство желудка"

M>>>Бывает и не такое , а как вам требование не использовать assert или похожие макросы ?
aik>>Нормальное требование. Ассерты в сервере, например — нонсенс.
D>А чем тебе сервера-то не угодили?

Их не видно. А ассерт ставит колом процесс, пока ты по кнопке не жмакнешь. Там вообще правила более жесткие, чтобы лепить даже лишний вывод в лог.
Re[10]: Необходимость ASSERT
От: minorlogic Украина  
Дата: 19.10.05 09:35
Оценка:
Здравствуйте, aik, Вы писали:

aik>Их не видно. А ассерт ставит колом процесс, пока ты по кнопке не жмакнешь. Там вообще правила более жесткие, чтобы лепить даже лишний вывод в лог.


Лог это и есть асертородобный макрос который запрещен

А идея перенаправить асерты в лог , не пользуется популярностью ?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[11]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 10:10
Оценка:
Здравствуйте, minorlogic, Вы писали:

aik>>Их не видно. А ассерт ставит колом процесс, пока ты по кнопке не жмакнешь. Там вообще правила более жесткие, чтобы лепить даже лишний вывод в лог.

M>Лог это и есть асертородобный макрос который запрещен
M>А идея перенаправить асерты в лог , не пользуется популярностью ?

Это не важно. Логи растут, переполняются, забивают винт => сервер лежит.
Re[12]: Необходимость ASSERT
От: dshe  
Дата: 19.10.05 10:27
Оценка:
Здравствуйте, aik, Вы писали:

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


aik>>>Их не видно. А ассерт ставит колом процесс, пока ты по кнопке не жмакнешь. Там вообще правила более жесткие, чтобы лепить даже лишний вывод в лог.

M>>Лог это и есть асертородобный макрос который запрещен
M>>А идея перенаправить асерты в лог , не пользуется популярностью ?

aik>Это не важно. Логи растут, переполняются, забивают винт => сервер лежит.


А что, логи никто не смотрит до тех пор пока они не забьют винт? Тогда, конечно, assert'ы вам ни к чему.
--
Дмитро
Re[13]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 10:40
Оценка:
Здравствуйте, dshe, Вы писали:

aik>>>>Их не видно. А ассерт ставит колом процесс, пока ты по кнопке не жмакнешь. Там вообще правила более жесткие, чтобы лепить даже лишний вывод в лог.

M>>>Лог это и есть асертородобный макрос который запрещен
M>>>А идея перенаправить асерты в лог , не пользуется популярностью ?
aik>>Это не важно. Логи растут, переполняются, забивают винт => сервер лежит.
D>А что, логи никто не смотрит до тех пор пока они не забьют винт? Тогда, конечно, assert'ы вам ни к чему.

Да все можно. И логи смотреть/стирать можно. И ассерты лепить. А можно направить усилия на повышение надежности кода, чтобы просто не было в коде веток, куда управление не может попасть в принципе.
Re[11]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 10:53
Оценка:
Здравствуйте, Sinclair, Вы писали:

D>>>А чем тебе сервера-то не угодили?

aik>>Их не видно. А ассерт ставит колом процесс, пока ты по кнопке не жмакнешь. Там вообще правила более жесткие, чтобы лепить даже лишний вывод в лог.
S>Ты, наверное, какие-то не те ассерты встречал.
S>Настоящие ассерты:
S>а) не имеют никакой связи с кнопками. Их обычная функция — вызвать аварийную остановку, при этом гарантируя запись/выдачу соответствующей информации. Отличие от самопроизвольной остановки — именно в наличии этой дополнительной информации

Аварийная остановка — плохо. У тебя система видео-наблюдения работает или диск пишется — аварийная остановка фатальна.
Вот сейчас с фирмварью вожусь — ну куда там ассертить? Это power management controller, он повиснет — дорогой, очень дорогой телекомный ящик встанет колом и целая деревня без телефонов сидеть будет, например. Там и аварийно остановиться нельзя даже.

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


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

S>А про какие ассерты ты говоришь?


Да про всякие Я веду к тому, что случаи — они разные бывают, и универсальное решение только одно — "убицца аб стенку, выпеть йад, ехать в бабруйск" и все такое прочее.
Re[12]: Необходимость ASSERT
От: minorlogic Украина  
Дата: 19.10.05 11:03
Оценка:
Супер , примерно так мне и пытались объяснить почему нельзя их использовать ..


Асерты — это механизм ОТЛАДКИ ,
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[12]: Необходимость ASSERT
От: LuciferMoscow Россия  
Дата: 19.10.05 11:22
Оценка:
Здравствуйте, aik, Вы писали:

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


aik>>>Их не видно. А ассерт ставит колом процесс, пока ты по кнопке не жмакнешь. Там вообще правила более жесткие, чтобы лепить даже лишний вывод в лог.

M>>Лог это и есть асертородобный макрос который запрещен
M>>А идея перенаправить асерты в лог , не пользуется популярностью ?

aik>Это не важно. Логи растут, переполняются, забивают винт => сервер лежит.

Пусть логирующий класс\другой класс сам чистит логи
Re[13]: Необходимость ASSERT
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 19.10.05 12:02
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

M>>>А идея перенаправить асерты в лог , не пользуется популярностью ?


aik>>Это не важно. Логи растут, переполняются, забивают винт => сервер лежит.

LM>Пусть логирующий класс\другой класс сам чистит логи

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

Меня тут недавно VladD2 спрашивал, что я на Ruby реального делаю Вот как раз последнее, что я делал -- это набор скриптов, которые ищут старые логи и архивируют их, а слишком старые заархивированные логи просто удаляют. Такой скрипт настраивается один раз администратором, запускается, например, через cron и все -- винты всегда остаются сухими и чистыми
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[14]: Необходимость ASSERT
От: LuciferMoscow Россия  
Дата: 19.10.05 12:22
Оценка:
Здравствуйте, aik, Вы писали:


aik>Здесь ошибка. Вместо


aik>ASSERT(szFirstName != NULL);


aik>надо писать


aik>ASSERT(szFirstName != NULL);

aik>if (NULL == szFirstName)
aik> return -1;

aik>Так и ассерт не нужен. Везде, всегда проверять коды возвратов. Но, в общем, я описал почему может быть запрет на ассерты, кто хотел — тот понял, кто не хочет понимать — будет упираться. Дальше тему развивать не интересно.

ТОгда уж лучше исключения. И корректно обрабатывать все такие ситуации... Времени своего не жалко?
Re[14]: Необходимость ASSERT
От: Sinclair Россия https://github.com/evilguest/
Дата: 19.10.05 12:33
Оценка:
Здравствуйте, eao197, Вы писали:

E>Имхо, самая большая проблема ASSERT-ов это то, что они выбрасываются из production кода. Абыдна бывает получать в production ошибку в функции RegisterUser (или даже в дебрях SaveToDb) из-за того, что где-то выше один из szFirstName, szLastName получился нулевым.

Нет. Если там стоял ассерт, то ты получил ошибку из-за того, что test coverage был неполным. А если он был неполным, то нефиг выкидывать ассерты из продакшна.
E>Благодоря ASSERT-ам мы теряем возможность быстро продиагностировать проблему.
А что, без ассерта ты имел какую-то возможность быстро продиагностировать проблему? Расскажи мне, что это за замечательная возможность. Я тоже хочу ей пользоваться.
E>А отладить все невозможно. Поэтому и в production системах баги, к сожалению, есть.
Это, конечно, да. Но для борьбы с этим есть и другие способы.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[15]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 12:34
Оценка:
Здравствуйте, LuciferMoscow, Вы писали:

aik>>Здесь ошибка. Вместо

aik>>ASSERT(szFirstName != NULL);
aik>>надо писать
aik>>ASSERT(szFirstName != NULL);
aik>>if (NULL == szFirstName)
aik>> return -1;
aik>>Так и ассерт не нужен. Везде, всегда проверять коды возвратов. Но, в общем, я описал почему может быть запрет на ассерты, кто хотел — тот понял, кто не хочет понимать — будет упираться. Дальше тему развивать не интересно.
LM>ТОгда уж лучше исключения. И корректно обрабатывать все такие ситуации...

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

LM>Времени своего не жалко?


На что времени? Лишний if написать? У кого то это больше 15 секунд занимает? У меня в виндовых проектах так вообще есть макрос, который, если что не так, пишет в ATLTRACE сырец, строку, ассертит и возвращает E_POINTER на Ignore. В релизе и ассертить/писать не будет, но выполнение программы не изменится. Называется _ER. Его набор занимает вообще 5 секунд.

Я не агитирую против ассертов. Я агитирую за что чтоб люди сразу думали над обработкой ошибок, чем над расстановкой ловушек и не надеялись что тестирование найдет все ловушки. Не найдет. Так, когда еще активно хреначат, и нет времени заткнуть все ветвления, ассерты лепить можно и удобно, но не более того.
Re[15]: Необходимость ASSERT
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 19.10.05 12:42
Оценка:
Здравствуйте, Sinclair, Вы писали:

E>>Имхо, самая большая проблема ASSERT-ов это то, что они выбрасываются из production кода. Абыдна бывает получать в production ошибку в функции RegisterUser (или даже в дебрях SaveToDb) из-за того, что где-то выше один из szFirstName, szLastName получился нулевым.

S>Нет. Если там стоял ассерт, то ты получил ошибку из-за того, что test coverage был неполным. А если он был неполным, то нефиг выкидывать ассерты из продакшна.

Это в пределе. К которому нужно стремиться.

E>>Благодоря ASSERT-ам мы теряем возможность быстро продиагностировать проблему.

S>А что, без ассерта ты имел какую-то возможность быстро продиагностировать проблему? Расскажи мне, что это за замечательная возможность. Я тоже хочу ей пользоваться.

Да все просто. Вместо ASSERT-а, который исчезает с NDEBUG делаешь простые проверки с abort-ом или порождением исключения. Эти проверки остаются в production системе.
int RegisterUser(char * szFirstName, char* szLastName)
{
    if( !szFirstName )
        abort_program( "RegisterUser: szFirstName == NULL" );
    if( !szLastName )
        abort_program( "RegisterUser: szLastName == NULL" );

    if(strlen(szLastName) == 0) // а вот тут уже пользовательский ввод
    {
        return -1; // возвращаем код ошибки, чтобы вызывающий код мог отразить это в интерфейсе
    }
    return SaveToDb(szFirstName, szLastName);
}
... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[15]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 12:53
Оценка:
Здравствуйте, Sinclair, Вы писали:

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

aik>>Здесь ошибка. Вместо
aik>>ASSERT(szFirstName != NULL);
aik>>надо писать
aik>>ASSERT(szFirstName != NULL);
aik>>if (NULL == szFirstName)
aik>> return -1;
S>Не надо так писать. Если у тебя есть нормальный способ обработать ошибку — обрабатывай ошибку. Ассерт здесь не нужен. Ассерт нужен для проверки выполнения договоренностей.

Все не отловишь, значит, все равно надо все проверять, значит, ассерты не так полезны.

aik>>Так и ассерт не нужен. Везде, всегда проверять коды возвратов. Но, в общем, я описал почему может быть запрет на ассерты,

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

Диалог _CrtDbgReport. Консольный еще лучше — просто пишет об ошибке и грохает приложение. Шикарно.

aik>>кто хотел — тот понял, кто не хочет понимать — будет упираться.

S>Ну почему же упираться? Мне правда интересно. Я вот всю жизнь думал, что ассерты есть абсолютное благо.

Лет 5 назад, и я так думал. Абсолютное благо — только в деструкторах, которые вызываются автоматом

S>Не знаю ни одной проблемы от использования ассертов. Знаю проблемы от неверного использования ассертов. А тут оказывается, что может быть какой-то вред. Надо срочно узнать, какой именно — иначе я спать спокойно не смогу.


Он останавливает выполнение и затем грохает процесс. Я это уже писал.

aik>>Дальше тему развивать не интересно.

S>Ну как же, мы ведь только начали!
S>Дальше мы, я думаю, придем еще к чему-нибудь про читаемость кода. Ну там, к вредности использовать code convention, к запрету на комментарии в исходниках... Что у нас там еще из области догм по поводу читаемости кода есть? Давайте разрушим эти замшелые скрижали.

Про читаемость — это с кем то другим У меня главный критерий кода — проходимость дебагером. Т. е. минимум многострочных дефайнов и "один оператор — одна строка".

Еще из наблюдений (это не против ассертов, а вообще ) — msvc2003 клинит на ассертах через раз. Хотя, наверное, на нее так DirectShow реагирует, или p2-400. Но — задолбала. Не в курсе как это подправить?
Re[16]: Необходимость ASSERT
От: minorlogic Украина  
Дата: 19.10.05 14:01
Оценка:
По второму кругу , кто тебе мешает определить асерт в релизе , чтобы он скидывал логи ?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[18]: Необходимость ASSERT
От: minorlogic Украина  
Дата: 19.10.05 14:23
Оценка:
Здравствуйте, eao197, Вы писали:

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


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


E>Тогда это будет не assert.

E>Смысл assert-а в том, что он исчезает из кода при компиляции с NDEBUG. Если же в production он остается, значит это не assert, а обычная проверка.

Ну тогда определяйтесь с терминологией , без развода флейма.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[18]: Необходимость ASSERT
От: minorlogic Украина  
Дата: 19.10.05 14:37
Оценка:
Здравствуйте, aik, Вы писали:

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


Жду твоего определения.
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[19]: Необходимость ASSERT
От: eao197 Беларусь http://eao197.blogspot.com
Дата: 19.10.05 14:41
Оценка:
Здравствуйте, minorlogic, Вы писали:

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


M>Жду твоего определения.


http://www.opengroup.org/onlinepubs/007908799/xsh/assert.html

The assert() macro inserts diagnostics into programs. When it is executed, if expression is false (that is, compares equal to 0), assert() writes information about the particular call that failed (including the text of the argument, the name of the source file and the source file line number — the latter are respectively the values of the preprocessing macros __FILE__ and __LINE__) on stderr and calls abort().

Forcing a definition of the name NDEBUG, either from the compiler command line or with the preprocessor control statement #define NDEBUG ahead of the #include <assert.h> statement, will stop assertions from being compiled into the program.

... << RSDN@Home 1.1.4 stable rev. 510>>


SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re[15]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 14:42
Оценка:
Здравствуйте, Gaperton, Вы писали:

aik>>Но вообще понятно, кто не писал систем 24*7, не поймут как жить без ассертов

G>Я последние 6 лет пишу "24*7". Могу отвественно заявить, что без ассертов в случае сложной системы ты повесишься. Особенно для достаточно сложной асинхронной системы. Синклер тебе написал все правильно. Рекомендую перечитать и подумать.

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

G>Примеры использования ассертов, которые ты приводил — очень плохи. У нас в компании подобный код не пройдет инспекцию и будет запрещен к чекину. Основная философия написания отказоустойчивых систем — это let it crash с подробной информацией как можно раньше, с последующим перехватом и обработкой ошибки. Оттягивание обработки ошибочной ситуации и игнорирование (фатальной) ошибки, как у тебя, не дает никакой пользы, кроме следующего вреда:


Игнорирования нет. Есть возврата кода с ошибкой, который будет обработан в вызывающем коде, либо и он отдаст ошибку выше. Очень грубо говоря, это обратная раскрутка стека как при поиске обработчика исключения.
"let it crash" — вообще подозрительный подход. Мне больше нравится "если уж crash, то с максимальной информацией".

G>1) Очень сильно ухудшается читабельность кода. В разы. Что затрудняет сопровождение.


Неа. Что ассерт, что if(blabla) { ATLTRACE(blabla); return E_FAIL; } — один хрен.

G>2) При фатальной ошибке прога все равно упадет, но в другом месте, и с такими дикими симптомами, что причину ошибки ты вообще не найдешь. Я говорю, разумеется, о достаточно сложных системах, от полмиллиона строк и выше. А не о микроконтроллерах.


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


G>Дополню Синклера — он не договорил до конца. Ассерты применяются для практической реализации техники формальных спецификаций. Упрощенно — она состоит в том, что для функций определяется пара "предусловие" и "постусловие". Пример для сортировки: предусловие — true. постусловие — x[i] <= [i+1] для всех 0 < i < N-1. Вычисление постусловия занимает O(N) времени, и, разумеется, должно быть выкинуто из релиза. В дебаге ошибка через этот assert не пройдет.


В релизе — пройдет, релиз — это основной поставщик сложных ошибок.

Все-таки, стоит определить что за ассерты мы имеем ввиду. Ну что они делают, как выглядят и уходят ли из релизов.
Re[16]: Необходимость ASSERT
От: FR  
Дата: 19.10.05 14:43
Оценка:
Здравствуйте, aik, Вы писали:

aik>Еще из наблюдений (это не против ассертов, а вообще ) — msvc2003 клинит на ассертах через раз. Хотя, наверное, на нее так DirectShow реагирует, или p2-400. Но — задолбала. Не в курсе как это подправить?


У меня клинило если assert возникал после создания окна, но до входа в цикл обработки сообщений. Как лечить не знаю похоже не лечится так как проблема в выводе диалога который как раз перехватывает процедуру обработки сообщений, тогда когда она еще не начала работать.
Re[17]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 14:46
Оценка:
Здравствуйте, FR, Вы писали:

aik>>Еще из наблюдений (это не против ассертов, а вообще ) — msvc2003 клинит на ассертах через раз. Хотя, наверное, на нее так DirectShow реагирует, или p2-400. Но — задолбала. Не в курсе как это подправить?


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


не, совсем не то. У меня студия долго отрабатывает int3. Видимо, пытается за suspend'ить потоки процесса и не может, потому что некоторые в ядре что ли... Не понимаю я ее. С msvc6 таких напрягов не было.
Re[20]: Необходимость ASSERT
От: minorlogic Украина  
Дата: 19.10.05 14:52
Оценка:
Здравствуйте, eao197, Вы писали:

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


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


M>>Жду твоего определения.


E>http://www.opengroup.org/onlinepubs/007908799/xsh/assert.html

E>

E>The assert() macro inserts diagnostics into programs. When it is executed, if expression is false (that is, compares equal to 0), assert() writes information about the particular call that failed (including the text of the argument, the name of the source file and the source file line number — the latter are respectively the values of the preprocessing macros __FILE__ and __LINE__) on stderr and calls abort().

E>Forcing a definition of the name NDEBUG, either from the compiler command line or with the preprocessor control statement #define NDEBUG ahead of the #include <assert.h> statement, will stop assertions from being compiled into the program.


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

интерессно также почитать что на эту тему пишут в стандарте
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[21]: Необходимость ASSERT
От: aik Австралия  
Дата: 19.10.05 14:54
Оценка:
Здравствуйте, minorlogic, Вы писали:

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


блин. ну вот. зря столько по кнопкам фигачили
Тогда уж хотелось бы послушать того, кто запретил ассерто-подобные макросы, что он то имел ввиду.
Re[15]: Необходимость ASSERT
От: iZEN СССР  
Дата: 19.10.05 19:03
Оценка:
Здравствуйте, Gaperton, Вы писали:

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


aik>>Но вообще понятно, кто не писал систем 24*7, не поймут как жить без ассертов


G>Я последние 6 лет пишу "24*7". Могу отвественно заявить, что без ассертов в случае сложной системы ты повесишься. Особенно для достаточно сложной асинхронной системы. Синклер тебе написал все правильно. Рекомендую перечитать и подумать.


Рекомендую посмотреть на язык программирования Eiffel, специально разработанный для поддержки КОНТРАКТНОГО программирования в ООП.
Re[18]: Необходимость ASSERT
От: Владик Россия  
Дата: 19.10.05 19:10
Оценка:
Здравствуйте, aik, Вы писали:

aik>Частое нагибание весьма часто приведет к замене ASSERT(szFirstName != NULL) на if (NULL == szFirstName) return -1

aik>)

И кто дает гарантию, что эта -1 будет корректно обработана вызвавшим кодом, если такая ситуауция никогда не тестировалась? ASSERT, как здесь уже неоднократно говорилось, прежде всего — средство отладки и документирования кода. Приментельно к данному коду это означает, что szFirstName не может быть NULL (по определению — по задумке автора) и если это не так, то вызывающий код имеет ошибку. "return -1" — может означать что угодно, читая этот код не видно, что szFirstName == NULL — это нештатная ситуация и что такая ситуация может некорректно обрабатываться вызывающим кодом.
Как все запущенно...
Re[16]: Необходимость ASSERT
От: Владик Россия  
Дата: 19.10.05 19:26
Оценка:
Здравствуйте, iZEN, Вы писали:

ZEN>Рекомендую посмотреть на язык программирования Eiffel, специально разработанный для поддержки КОНТРАКТНОГО программирования в ООП.


Даже в Обероне ASSERT есть А ведь Вирт вырезал из этого языка "ненужные" конструкции просто нещадно
Как все запущенно...
Re[17]: Необходимость ASSERT
От: iZEN СССР  
Дата: 19.10.05 20:01
Оценка:
Здравствуйте, Владик, Вы писали:

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


iZEN>>Рекомендую посмотреть на язык программирования Eiffel, специально разработанный для поддержки КОНТРАКТНОГО программирования в ООП.


В>Даже в Обероне ASSERT есть А ведь Вирт вырезал из этого языка "ненужные" конструкции просто нещадно

А может ему просто не хватило смелости полностью скопировать Eiffel?
Разработчикам Java, например, не хватило...а жаль.
Re[18]: Необходимость ASSERT
От: DrDred Россия  
Дата: 20.10.05 05:48
Оценка:
Здравствуйте, iZEN, Вы писали:

iZEN>>>Рекомендую посмотреть на язык программирования Eiffel, специально разработанный для поддержки КОНТРАКТНОГО программирования в ООП.


В>>Даже в Обероне ASSERT есть А ведь Вирт вырезал из этого языка "ненужные" конструкции просто нещадно

ZEN>А может ему просто не хватило смелости полностью скопировать Eiffel?
ZEN>Разработчикам Java, например, не хватило...а жаль.

Может немного не в тему, но есть люди, пошедшие дальше Java, например Nice.
Компилится в байт-код, понимаемый JVM.
Там поддержка контрактного программирования пошла дальше assert, сделаны пре- и постусловия, например:
interface IStack<T>{
  int size() ensures result >= 0 : "size can not be less than one";
    
  void push(T t) ensures size(this) > 0 : "pushing an item should increase the size";    
    
  boolean isEmpty() ensures result == (size(this) == 0) : "if size is zero, result should be false";    

  T pop() requires !isEmpty(this) : "Can not pop an empty stack";

  T peek() requires !isEmpty(this) : "Can not pop an empty stack";
}

Здесь requires — предусловия, ensure — постусловия
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
--
WBR, Alexander
Re: Необходимость ASSERT
От: minorlogic Украина  
Дата: 20.10.05 06:50
Оценка:
Господа , у кого под рукой стандарт , посмотрите пожалуйста что там про асерты пишут ?
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[19]: Необходимость ASSERT
От: FR  
Дата: 20.10.05 10:32
Оценка:
Здравствуйте, DrDred, Вы писали:

DD>Может немного не в тему, но есть люди, пошедшие дальше Java, например Nice.


В D (http://www.digitalmars.com/d) тоже такое есть такое:

    long square_root(long x)
        in
        {
        assert(x >= 0);
        }
        out (result)
        {
        assert((result * result) == x);
        }
        body
        {
        return math.sqrt(x);
        }


assert, не сишный он бросает исключение которое можно перехватить
Re[16]: Необходимость ASSERT
От: Gaperton http://gaperton.livejournal.com
Дата: 20.10.05 12:25
Оценка:
Здравствуйте, iZEN, Вы писали:

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


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


aik>>>Но вообще понятно, кто не писал систем 24*7, не поймут как жить без ассертов


G>>Я последние 6 лет пишу "24*7". Могу отвественно заявить, что без ассертов в случае сложной системы ты повесишься. Особенно для достаточно сложной асинхронной системы. Синклер тебе написал все правильно. Рекомендую перечитать и подумать.


ZEN>Рекомендую посмотреть на язык программирования Eiffel, специально разработанный для поддержки КОНТРАКТНОГО программирования в ООП.


Это что — "замер"? Ну тогда — спасибо, я в курсе существования этого языка. А вам рекомендую посмотреть на язык программирования CLU, задолго до появления ОО баззвордов разработанный г-жой Лисков и компанией для поддержки метода АБСТРАКЦИЙ И СПЕЦИФИКАЦИЙ, из идей которого, в последствии, получился Eiffel и несколько других языков. Что характерно, со времен Лисков ничего радикально нового в этой области не придумано.
Re[16]: Необходимость ASSERT
От: IID Россия  
Дата: 21.10.05 12:30
Оценка:
Здравствуйте, aik, Вы писали:

G>>2) При фатальной ошибке прога все равно упадет, но в другом месте, и с такими дикими симптомами, что причину ошибки ты вообще не найдешь. Я говорю, разумеется, о достаточно сложных системах, от полмиллиона строк и выше. А не о микроконтроллерах.


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


если произошло что-то фатальное, лучше проге больше ничего не доверять. Самый красноречивый пример большой системы и подобной стратегии обработки фатальной ошибки — BSOD у Win
kalsarikännit
Re[14]: Необходимость ASSERT
От: minorlogic Украина  
Дата: 23.10.05 08:47
Оценка:
Здравствуйте, Mystic, Вы писали:

M>>Асерты — это механизм ОТЛАДКИ ,

M>Т. е. тебе нельзя отлаживать свой код?

Скажем так , код без асертов мне отлаживать намного труднее. Те мболее что прект представлял из себя лоскутное одеяло , причем дырявое. Приходилось проверять не только сосотояние переменных но и например дампы памяти , до операций и после ..
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.