主要观点:counted_by
属性在 Clang-18 中引入,不久将在 GCC-15 中可用,其目的是将flexible-array member
与在运行时某个时刻保存该数组元素数量的结构成员相关联,这对于通过array bounds sanitizer
和__builtin_dynamic_object_size()
内置函数实现运行时边界检查至关重要,在用户空间可通过[-D_FORTIFY_SOURCE=3]
启用额外的安全级别。
关键信息:
- 示例代码展示了带有
counted_by
属性的灵活数组结构,如struct bounded_flex_struct
。 - 在 Linux 内核中,通过
__counted_by()
宏包装counted_by
属性,如struct sched_table
的示例。 - 使用
counted_by
属性有诸多要求,如计数器需在首次引用灵活数组成员前初始化,数组元素数量需不少于计数器指示的数量等。 - 列举了内核中一些
counted_by
注释的相关补丁及存在的问题,如在brcm80211
、wil6210
等驱动中的示例,包括计数器初始化位置、在循环中更新计数器等问题及相应的解决方案。
重要细节:
- 在
brcm80211
的补丁中,需注意datalen
作为灵活数组data
的计数器,赋值要在memcpy
之前。 - 在
wil6210
的补丁中,当num_channels
作为计数器时,要注意编译器对动态数组索引的限制,避免导致未定义行为。 - 还可以使用辅助变量代替计数器直接访问灵活数组,如
aux_num_cis
在Bluetooth
相关代码中的使用。 - 提到了最近针对一些错误注释的 bug 修复补丁,如
wifi: iwlwifi: mvm
中的相关内容。未来将讨论注释灵活结构数组的问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。