cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

расширить возможности синтаксических анализаторов при помощи Nullable и NotNull #450

Open neshkeev opened 3 years ago

neshkeev commented 3 years ago

Описание

В Java существуют jsr 305 и jsr 308, которые стандартизировали поддержку указания программистом в каких местах возможно, а в каких невозможны null значения. Компания JetBrains пошла немного дальше и добавила ещё Contract аннотацию, которая позволяет указывать взаимосвязи между входными и выходными параметрами функции. Intellij IDEA имеет очень эффективный статический анализатор, который позволяет на этапе разработки отлавливать большое количество проблем, связанных с разыменовыванием null указателя.

Реализовать эту идею можно при помощи пустых #define макросов:

#define __Nullable
#define __NotNull
#define __Contract(...)

Примеры

  1. Возврат null значения из функции, которая должна вернуть __NotNull:
__NotNull int* getId() {
    return null; // нарушение контракта
}
  1. Функция может возвратить null, но клиентский код не проверяет возвращаемое значение:
__Nullable int* getId();

int* idPointer = getId();
std::cout << *idPointer; // segfault
  1. Если аргумент функции null то функция должна вернуть новый объект:
    __Contract("null -> new") int* ensureNotNull(int* v) {
    return v; // забыли соблюсти контракт
    }     

    Имеющиеся решения

clang предлагает свои __nullable и __nonnull аннотации

tomilov commented 3 years ago

В C++ Core Guidelines такое предлагается.