c - 警告の抑制sk *関数

原文 c openssl

OpenSSLのライブラリを警告メッセージで使用する場合:

warning: pointer type mismatch in conditional expression [enabled by default]


サンプルコード:

X509_OBJECT *objs = sk_X509_OBJECT_value(st->objs, i);
...
sk_X509_OBJECT_free(objs); // this string generate error


対応するソースのタイプを変更しようとしましたが、役に立ちませんでした:

sk_X509_OBJECT_free( (_STACK*)objs );
sk_X509_OBJECT_free( (X509_OBJECT*)objs );


それを避ける方法?
答え
まず、sk_X509_OBJECT_freeの定義は次のとおりです。

$ grep -r -i sk_X509_OBJECT_free * | grep define
crypto/stack/safestack.h:#define sk_X509_OBJECT_free(st) SKM_sk_free(X509_OBJECT, (st))


そして:

$ grep -r -i SKM_sk_free * | grep define
crypto/stack/safestack.h:#define SKM_sk_free(type, st) \
    sk_free(CHECKED_STACK_OF(type, st))


したがって、sk_freeは基礎となる関数です。

$ grep -r -i "void sk_free" *
crypto/stack/stack.c:void sk_free(_STACK *st)
crypto/stack/stack.h:void sk_free(_STACK *);
doc/ssleay.txt:void sk_free(STACK *);


したがって、_STACK*にキャストすると警告が修正されます。

しかし、新しい警告がCHECKED_SK_FREE_FUNC(またはCHECKED_SK_FREE_FUNC2)で導入されたと思います。これは、シグネチャを提供するのではなく、関数をvoid (*)にキャストするためです。それらを以下に示します。

#define CHECKED_SK_FREE_FUNC(type, p) \
    ((void (*)(void *)) ((1 ? p : (void (*)(type *))0)))

#define CHECKED_SK_FREE_FUNC2(type, p) \
    ((void (*)(void *)) ((1 ? p : (void (*)(type))0)))




マクロに関心がある場合は、ternary operator with a constant (true) value?も参照してください。
関連記事

c - ファイルからの正確な印刷とスキャン(C)

c - Cでのファイルの終わり(EOF)

c - 再帰関数内で文字列配列を返すか、それをコピーするにはどうすればよいですか?

c - EVP_PKEYを使用したOpenSSL RSA_size

c - 構造体を関数に渡し、Cで変更する

c - C99で関数ポインターの構造がNULLかどうかを確認するクイックチェック

python - プロセス間通信Python [重複]

c++ - ゼロパディング付きのインテルMKLを使用した3D FFT

c - 複数の構造体を宣言し、それらをすでに割り当てられているメモリにオーバーレイする

c - 厳格なエイリアシングを破った結果を理解する