Почему -mmacosx-version-min=10.10 не запрещает использование функции, помеченной как начиная с 10.11?

По моему пониманию, как наличие макросов и -mmacosx-version-min флаг работает, следующий код должен не скомпилироваться при нацеливании на OS X 10.10:

#include <Availability.h>
#include <CoreFoundation/CoreFoundation.h>
#include <Security/Security.h>

#if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED)
#error
#endif

#if __MAC_OS_X_VERSION_MIN_REQUIRED < 101000
#error __MAC_OSX_VERSION_MIN_REQUIRED too low
#endif

#if __MAC_OS_X_VERSION_MIN_REQUIRED > 101000
#error __MAC_OSX_VERSION_MIN_REQUIRED too high
#endif

int main() {

    size_t len = 0;

    SSLContextRef x{};
    auto status = SSLCopyRequestedPeerNameLength(x, &len);
    return status != 0;
}

потому что функция SSLCopyRequestedPeerNameLength помечен как доступный в 10.11 в SecureTransport.h:

$ grep -C5 ^SSLCopyRequestedPeerNameLength /System/Library/Frameworks//Security.framework/Headers/SecureTransport.h

/*
 * Server Only: obtain the hostname specified by the client in the ServerName extension (SNI)
 */
OSStatus
SSLCopyRequestedPeerNameLength  (SSLContextRef  ctx,
                                 size_t         *peerNameLen)
    __OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);

Тем не менее, когда я компилирую в командной строке -mmacosx-version-min=10.10 Я не получаю никакого предупреждения, несмотря на -Wall -Werror -Wextra:

$ clang++ -Wall -Werror -Wextra ./foo.cpp --std=c++11 -framework Security -mmacosx-version-min=10.10 --stdlib=libc++ ; echo $?
0

Есть ли какое-то дополнительное определение, которое мне нужно предоставить, или специальное предупреждение, чтобы убедиться, что я не выявляю зависимость от API более ранних, чем 10.10? Я действительно ожидал, что -mmacosx-version-min=10.10 будет препятствовать использованию API с тегами с более высокими номерами версий.

Что я здесь не так понял?

Использование XCode 10.0 (10A255) на MacOS 10.13.6 здесь.

1 ответ

Решение

Теперь, когда я могу ответить на свой вопрос, я буду: вам нужно добавить -Wunguarded-availability на ваши флаги компиляции. Только тогда вы получите предупреждение / ошибку.

Другие вопросы по тегам