Здравствуйте, 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