在 C(和 Linux 中)如何使用新的 counted_by 属性 - Gustavo A. R. Silva

主要观点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注释的相关补丁及存在的问题,如在brcm80211wil6210等驱动中的示例,包括计数器初始化位置、在循环中更新计数器等问题及相应的解决方案。

重要细节

  • brcm80211的补丁中,需注意datalen作为灵活数组data的计数器,赋值要在memcpy之前。
  • wil6210的补丁中,当num_channels作为计数器时,要注意编译器对动态数组索引的限制,避免导致未定义行为。
  • 还可以使用辅助变量代替计数器直接访问灵活数组,如aux_num_cisBluetooth相关代码中的使用。
  • 提到了最近针对一些错误注释的 bug 修复补丁,如wifi: iwlwifi: mvm中的相关内容。未来将讨论注释灵活结构数组的问题。
阅读 17
0 条评论