C ++ проверка кодов возврата - PullRequest
1 голос
/ 02 ноября 2010

Стоит ли проверять коды возврата для методов, которые не должны завершиться сбоем?

Например, я обычно делаю:

char buf[MAXBUF];
snprintf(buf, sizeof(MAXBUF), "%s.%d", str, time);

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

Ответы [ 5 ]

4 голосов
/ 02 ноября 2010

Краткий ответ: Да

Длинный ответ: Да, потому что он ловит глупые ошибки, как показано ниже.

char buf[MAXBUF];
snprintf(buf, sizeof(MAXBUF), "%s.%d", str, time);

// sizeof(MAXBUF) is probably equal to sizeof(int)

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

C ++ решение:

std::stringstream  buf;
buf << str << "." << time;  // No chance of error as compiler does the work.
2 голосов
/ 02 ноября 2010

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

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

0 голосов
/ 02 ноября 2010

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

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

int result = snprintf(buf, sizeof buf, "%s.%d", str, time);
assert(result >= 0 && result <= (sizeof buf) - 1);

Если честно, я бы не всегда проверял, но это зависит от того, почему я думаю, что str не может быть таким длинным. Если это по действительно фундаментальной причине (например, это имя файла из структуры dirent, а MAXBUF определено в терминах MAX_FILENAME), то я, вероятно, не стал бы беспокоиться. Если это потому, что есть какая-то проверка в другом месте, или вызывающий обязан передать строку только определенной длины, то это может быть идеей для assert, просто из-за шанса поймать чужую ошибку когда-нибудь. Очевидно, что если str - это какой-либо внешний вид без проверки, то важно проверить.

0 голосов
/ 02 ноября 2010

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

В большинстве случаев это не сложно.

0 голосов
/ 02 ноября 2010

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

...