g++下如何实现std::array的编译期范围越界检查
g++ std::array编译期边界检查实现方案
可用编译选项
- 核心警告选项为
-Warray-bounds,该选项可识别编译期可确定的std::array常量下标越界场景,你给出的示例代码刚好属于可被该选项检测的范围。 - 该警告需要配合**-O1及以上优化等级**使用:编译器需要执行基础的静态数据流分析,才能推导得到
rarelyUsedFunction入参的std::array长度固定为2,和访问下标5存在冲突。 - 示例编译命令:
执行后会直接输出对应越界警告,如果需要将这类警告升级为编译错误阻断构建,可以额外添加g++ -O1 -Warray-bounds your_code.cpp-Werror=array-bounds参数。
更严格的常量下标编译期检查方案
如果你的访问下标本身是编译期常量,可以改用C++11起支持的std::get<下标>(std::array)接口替代operator[],该接口的下标越界会直接触发编译错误,不需要依赖任何警告选项和优化等级,你提供的示例中如果将input[5]改为std::get<5>(input),会直接报编译失败,不存在漏检可能。
补充说明
编译期边界检查仅能覆盖下标值、容器长度均在编译期可确定的场景,如果下标是运行期动态生成的变量,或者编译器无法推导得到对应std::array的实际长度,仍然需要结合运行期检查方案做兜底。
内容的提问来源于stack exchange,提问作者skiChris
相关产品推荐
相关产品推荐

