抑制警告sk *功能

时间:2014-12-16 12:42:23

标签: 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 );

如何避免它?

1 个答案:

答案 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?

相关问题