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

Насколько я понимаю, как работают макросы доступности и флаг -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 Ответ

0 голосов
/ 25 октября 2018

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

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