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

如何让GCC检测__wrap包装函数与原函数的签名是否匹配

解决方案

1. 纯C标准实现(兼容C99及以上,无任何编译器扩展)

不需要依赖GCC特有功能,利用C语言本身的类型检查规则即可实现:

// 第一步:定义原函数的函数指针类型
typedef int (*myF_proto)(int);
// 第二步:尝试将包装函数赋值给该类型的指针,签名不匹配会直接触发编译错误
myF_proto __wrap_myF_check __attribute__((unused)) = __wrap_myF;

如果__wrap_myF的返回值、参数数量、参数类型和原函数不匹配,编译器会直接抛出类型不兼容的编译错误。其中__attribute__((unused))是GCC/Clang的可选属性,用于消除变量未使用的警告,不需要的话可以去掉。

2. GCC/Clang扩展实现(更简洁,C23后可成为标准方案)

你设想的__builtin_signature功能,在GCC中对应的是__builtin_types_compatible_p内置函数,配合typeof扩展即可实现静态断言检查:

// C11及以上版本支持_Static_assert
_Static_assert(__builtin_types_compatible_p(typeof(myF), typeof(__wrap_myF)), "包装函数与原函数签名不匹配");

其中:

  • typeof是GCC/Clang长期支持的类型获取扩展,已被纳入C23标准
  • __builtin_types_compatible_p会判断两个类型是否兼容,兼容时返回1,不兼容返回0

你还可以把这个逻辑封装成通用宏,方便批量校验多个包装函数:

#define CHECK_WRAPPER(orig, wrap) \
    _Static_assert(__builtin_types_compatible_p(typeof(orig), typeof(wrap)), #wrap " 签名与原函数 " #orig " 不匹配")

// 使用示例
CHECK_WRAPPER(myF, __wrap_myF);
CHECK_WRAPPER(yourF, __wrap_yourF);

说明

GCC的--wrap是纯链接层面的符号替换,链接器只匹配符号名称,不校验符号的类型信息,所以默认不会发现签名不一致的问题,上述方案都是在编译阶段提前做类型校验,避免运行时出现未定义行为。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:57:03