1

Apple のセキュア トランスポート フレームワークを使用してネットワークに TLS を実装する方法を学んでいますが、少し混乱しています。ソケット fds を SSLConnectionRefs にキャストするだけでよいと思いますが、そうすると警告が表示されCast to 'SSLConnectionRef' (aka 'const void *') from smaller integer type 'int'ます。

int sockfd = socket(...);
...
SSLContextRef sslContext = SSLCreateContext(...);

// This line gives the warning
SSLSetConnection(sslContext, (SSLConnectionRef)sockfd);

void *は よりも大きいので、ここで情報を失うことはありませんよintね? したがって、これは安全なはずです。コンパイラの警告が気になります。提案をありがとう。

4

2 に答える 2

3

やったほうがいい

SSLSetConnection(sslContext, (SSLConnectionRef)(intptr_t)sockfd);
于 2015-06-04T15:44:45.433 に答える
1

(SSLConnectionRef)(long)sockfd動作し、現在のすべてのコンパイラに当てはまる限り安全である必要がありますsizeof(void*) > sizeof(int)が、必ずしも保証されているわけではありません。

もう 1 つの方法は、警告を一時的に無効にすることです。

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wint-to-point-cast"
    SSLSetConnection(sslContext, (SSLConnectionRef)sockfd);
#pragma clang diagnostic pop

最終的に、「正しい」解決策は、malloc またはその他のスキームを介して割り当てた整数へのポインターを実際に渡すことです。これがすべてオブジェクト内にある場合は、fd をインスタンス変数に格納し、&_sockfd; に渡します。

于 2014-05-09T15:42:40.167 に答える