在警告消息中使用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 );
如何避免它?
答案 0 :(得分:0)
首先,这里定义了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?。