为何std::copy未触发缓冲区溢出?仅获Clang sanitizer未定义行为警告
关于std::copy未定义行为的跨平台疑问
- 代码评审中发现一行
std::copy代码被Clang sanitizer标记为未定义行为,但实际调试、测试时并未出现预期的结构体后续字段溢出情况,运行结果符合预期,对此存在困惑。 - 原代码意图是复制8个
long类型元素,但src.arr[0]的类型是指向long[4]的指针。原本预期src.arr[0] + 8会指向第8个long[4]元素,进而溢出到结构体中arr之后的overflowArray字段,但实际未发生溢出。
关键代码与报错信息
原存在问题的代码行:
std::copy(src.arr[0], src.arr[0] + 8, dst.arr[0]); // <-- 未定义行为
Clang sanitizer运行时提示:
runtime error: index 8 out of bounds for type 'long[4]' SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior
修改后的代码
为明确操作单个long元素的意图,修改为如下写法:
std::copy(&src.arr[0][0], &src.arr[0][0] + 8, &dst.arr[0][0]);
有人认为此写法冗余,因为两种写法的起始地址一致,但修改后的代码能清晰表达复制long元素的逻辑。
核心疑问
这段被标记为未定义行为的代码,在不同平台或编译器下是否会产生错误结果?
内容的提问来源于stack exchange,提问作者PaulH
相关产品推荐
相关产品推荐

