Interfaces
I.12
Объявляйте указатель, который не должен быть null, как `not_null`
Причина
Помочь избежать ошибок разыменования nullptr. Улучшить производительность за счёт избегания избыточных проверок на nullptr.
Пример
int length(const char* p); // неясно, допустимо ли length(nullptr)
length(nullptr); // OK?
int length(not_null<const char*> p); // лучше: можно предполагать, что p не может быть nullptr
int length(const char* p); // мы должны предполагать, что p может быть nullptr
Указывая намерение в исходном коде, разработчики и инструменты могут обеспечить лучшую диагностику, например, находить некоторые классы ошибок через статический анализ, и выполнять оптимизации, такие как удаление ветвей и проверок на null.
Примечание
not_null определён в библиотеке поддержки руководящих принципов.
Примечание
Предположение о том, что указатель на char указывает на C-строку (строку символов с завершающим нулём), по-прежнему неявно и является потенциальным источником путаницы и ошибок. Используйте czstring вместо const char*.
// можно предполагать, что p не может быть nullptr
// можно предполагать, что p указывает на массив символов с завершающим нулём
int length(not_null<czstring> p);
Примечание: length() — это, конечно, замаскированный std::strlen().
Контроль
- (Простой) ((Основание)) Если функция проверяет параметр-указатель на
nullptrперед доступом, на всех путях потока управления, то предупреждать, что его следует объявитьnot_null. - (Сложный) Если функция с возвращаемым значением-указателем гарантирует, что оно не является
nullptrна всех путях возврата, то предупреждать, что возвращаемый тип следует объявитьnot_null.