__attribute__((__bounded__(__string__,2,3)))? 是何含义?OpenBSD代码移植遇该属性警告求解答
OpenBSD
__bounded__ 属性解析与跨平台移植指引 属性本质与核心作用
__bounded__ 是OpenBSD为自身定制编译器栈定义的非标准化编译注解,并非GCC、Clang等主流编译器上游的通用属性,因此在其他平台编译时会直接触发“未知属性”的警告。
针对代码中的注解 __attribute__((__bounded__(__string__,2,3))):
- 注解的参数按函数形参从1开始计数,标注规则为「缓冲区指针位置 + 缓冲区长度参数位置」
- 对应
SHA256Update的形参列表,第2个参数是传入的只读数据缓冲区,第3个参数是该缓冲区的字节长度 - 该注解完全没有运行时逻辑开销,仅用于给编译期静态检查模块传递元数据:提示编译器校验所有函数调用场景下,传入的缓冲区长度值不会超过对应指针指向的内存块实际大小,提前发现越界读写风险。
跨平台移植替换方案
- 兼容GCC 10+/Clang 12+平台:可直接使用上游原生的
access属性实现完全等效的检查能力,把原有的bounded注解替换为__attribute__((access(read_only_buffer, 2, 3)))。该属性触发的静态检查逻辑与OpenBSD的bounded注解完全对齐,同样不会增加任何运行时开销。 - 兼容低版本编译器、MSVC平台:直接删除这段
__attribute__声明不会影响任何代码运行逻辑。因为该属性不参与二进制生成逻辑,删除后仅会损失对应场景的编译期静态检查能力,不会改变函数的实际行为。 - 最优跨平台兼容写法:可通过条件宏做分支适配,既保留OpenBSD原生环境的检查能力,又消除其他平台的编译警告。参考实现:
#if defined(__OpenBSD__) # define ANNOTATE_BOUNDED_STR(buf_idx, len_idx) __attribute__((__bounded__(__string__, buf_idx, len_idx))) #elif (__GNUC__ >= 10) || (__clang_major__ >= 12) # define ANNOTATE_BOUNDED_STR(buf_idx, len_idx) __attribute__((access(read_only_buffer, buf_idx, len_idx))) #else # define ANNOTATE_BOUNDED_STR(buf_idx, len_idx) #endif // 适配后的函数声明 void SHA256Update(SHA2_CTX *, const void *, size_t) ANNOTATE_BOUNDED_STR(2, 3);
内容的提问来源于stack exchange,提问作者shreyas_patel21
相关产品推荐
相关产品推荐

