You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenSSL中的STACK_OF是什么?其定义与实现机制是什么

OpenSSL STACK_OF 宏问题解答

相关代码参考

OpenSSL CMS模块中用到STACK_OF的代码片段如下:

static STACK_OF(CMS_RevocationInfoChoice)
**cms_get0_revocation_choices(CMS_ContentInfo *cms)
{
    switch (OBJ_obj2nid(cms->contentType)) {

    case NID_pkcs7_signed:
        return &cms->d.signedData->crls;

上述代码片段来自OpenSSL源码crypto/cms/cms_lib.c的第561行。

此前公开技术讨论中提到的STACK_OF宏定义写法为:

#define STACK_OF(type) struct stack_st_##type

但使用正则#define\s*STACK_OF全局检索OpenSSL源码时无法匹配到对应定义,相关问题具体说明如下:

  • 本质:STACK_OF是OpenSSL实现类型安全栈容器的核心泛型宏,是OpenSSL自研泛型集合框架的对外暴露类型声明宏,用来规避C语言无原生泛型、通用void*容器类型不安全的问题。
  • 实际定义位置:直接检索单独的#define STACK_OF行找不到结果,是因为OpenSSL 1.1.0及之后版本重构了安全栈的宏实现逻辑,STACK_OF不是以独立宏定义行存在的,而是在include/openssl/safestack.h头文件中,通过内部宏SKM_DEFINE_STACK_OF_INTERNAL嵌套生成,老版本(1.0.x及更早)才会以独立宏定义的形式直接写在头文件中。
  • 实现逻辑:核心展开逻辑和老版本完全一致,利用C预处理器的标记拼接运算符##,给传入的类型名拼接stack_st_前缀,生成对应类型专属的栈结构体类型。例如代码中写STACK_OF(CMS_RevocationInfoChoice),预处理器最终展开结果就是struct stack_st_CMS_RevocationInfoChoice,也就是专门存储CMS_RevocationInfoChoice*类型元素的栈结构体。新版本额外嵌套了const属性适配、编译期类型检查相关的辅助宏,没有改变核心拼接逻辑。
  • 作用:为OpenSSL全库提供类型安全的动态栈(可变长动态数组)实现,库内所有需要批量存储同类型元素的场景(比如签名数据里的CRL列表、证书链存储、扩展项列表等)都通过这套宏生成专属栈类型,在编译阶段就能完成部分类型校验,大幅降低通用无类型容器的类型转换错误概率。

内容的提问来源于stack exchange,提问作者Bob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:15:45