В документации по функциям отсутствует информация о возвращаемых указателях, имеющих значение NULL или не NULL. Что предполагать? - PullRequest
2 голосов
/ 13 февраля 2020

Я пытаюсь выяснить, какие функции OpenSSL могут возвращать указатели NULL, а какие нет. Иногда в документации четко говорится, что функция может возвращать NULL, например,

X509_NAME_get_entry

X509_NAME_get_entry () возвращает указатель X509_NAME на запрошенная запись или NULL, если индекс недействителен.

Иногда они этого не делают, например

X509_get_subject_name

В нем только говорится

X509_get_subject_name () возвращает имя субъекта сертификата x. Возвращаемое значение является внутренним указателем, который НЕ ДОЛЖЕН быть освобожден.

Неясно (для меня), означает ли это, что указатель всегда действителен или он также может быть НЕДЕЙСТВИТЕЛЕН.

Другой пример:

x509_name_entry_get_data

объясняет это для версии 1.1.1

X509_NAME_ENTRY_get_object () возвращает допустимая структура ASN1_OBJECT, если она установлена, или NULL, если произошла ошибка.

, но не для 1.1.0

Взгляд на исходный код не очень помогают, например, X509_get_subject_name просто возвращает члена:

X509_NAME *X509_get_subject_name(const X509 *a)
{
    return a->cert_info.subject;
}

Если этому члену когда-либо назначен нулевой указатель или нет ...

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

Кто-нибудь знает, как интерпретировать Документация OpenSSL правильно на этот счет? Или это просто ужасно противоречиво, и никто не может сказать по-настоящему?

1 Ответ

2 голосов
/ 13 февраля 2020

В общем, я бы доверял страницам руководства, и если он говорит, что указатель возвращен, и в нем не упоминается, что указатель NULL может быть возвращен, то вы должны быть в состоянии полагаться на него, что это действительно так. никогда не бывает. В противном случае я бы посчитал это серьезной ошибкой (будь то в man-странице или в коде), о которой следует сообщать.

Для x509_name_entry_get_data() раздел «возвращаемое значение» полностью отсутствовал в 1.1.0 версия. Это было исправлено.

Я действительно проигнорировал бы и проверил бы каждый возвращаемый указатель на NULL. Это также сохраняет ваш код при изменении API в будущем.

Если вы действительно этого не хотите и не хотите полагаться только на man-страницы, вы можете по крайней мере выполнить простую проверку: создать пустой объект вызовите соответствующую функцию и проверьте возвращаемое значение. Например, для объекта X509:

X509 *x509=X509_new();
printf("%p\n", X509_get_subject_name(x509));

Это действительно дает действительный указатель, поэтому намекает, что страница справочника верна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...