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
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.