查询memcpy等函数无效/空指针为UB的C++标准依据
memcpy、memset、memmove空/无效指针(含count=0)的未定义行为标准依据 核心结论
即使count为0,传递空指针或无效指针给memcpy、memset或memmove的行为仍属于未定义行为(UB),以下是C++标准草案N4860中的对应条款依据:
1. memcpy的规定
来自N4860第20.5.1.2节
memcpy函数:
效果:从src指向的对象复制count个字节到dest指向的对象。每个对象都应是可平凡复制的类型。
前置条件:dest和src应指向可访问的对象。
备注:如果dest和src重叠,则行为未定义。
这里的前置条件明确要求dest和src必须指向可访问的对象——空指针或无效指针显然不满足这一要求,无论count是否为0,违反前置条件即触发未定义行为。
2. memmove的规定
来自N4860第20.5.1.3节
memmove函数:
效果:从src指向的对象复制count个字节到dest指向的对象。每个对象都应是可平凡复制的类型。复制发生时,仿佛先将字节复制到一个临时数组,再从临时数组复制到目标对象。
前置条件:dest和src应指向可访问的对象。
同样,前置条件要求指针指向可访问对象,空/无效指针违反该条件,行为未定义,与count值无关。
3. memset的规定
来自N4860第20.5.1.4节
memset函数:
效果:将dest指向的对象的前count个字节设置为value(转换为unsigned char)。
前置条件:dest应指向可访问的对象。
memset的前置条件明确要求dest指向可访问对象,空指针或无效指针不满足该要求,无论count是否为0,行为均为未定义。
内容的提问来源于stack exchange,提问作者Senua
相关产品推荐
相关产品推荐

