sha*_*oth 13 c++ sizeof null-pointer undefined-behavior language-lawyer
首先,我已经看到了关于C99的这个问题,并且接受的答案参考操作数未在C99标准草案中评估.我不确定这个答案是否适用于C++ 03.还有一个关于C++的问题,引用了类似措辞的答案,并且在某些情况下,还会出现未评估的操作数.未评估未评估的操作数.措辞.
我有这个代码:
int* ptr = 0;
void* buffer = malloc( 10 * sizeof( *ptr ) );
Run Code Online (Sandbox Code Playgroud)
问题是 - 里面是否有空指针取消引用(以及UB)sizeof()?
C++ 03 5.3.3/1表示sizeof运算符产生其操作数的对象表示中的字节数.操作数是表达式(未计算)或带括号的type-id.
链接到答案引用这个或类似的措辞,并使用"未评估"部分推断出没有UB.
但是,在这种情况下,我无法找到标准链接评估的确切位置与是否具有UB.
"不评估"应用sizeof的表达式使得在C++中取消引用sizeof中的null或无效指针是合法的吗?
我认为这个标准目前还没有详细说明,比如许多问题,比如什么是未指定的C++运算符操作数的值类别?.我不认为这是故意的,就像hvd指出一样,这对委员会来说可能是显而易见的.
在这个具体案例中,我认为我们有证据表明其意图是什么.来自Rapperswil会议的GB 91评论说:
将空指针取消引用作为我们规范的一部分是有点令人反感的,因为我们正在未定义行为的边缘上玩.通过添加已在这些相同表达式中使用的declval函数模板,不再需要这样做.
并提出了一个替代表达式,它指的是这个表达式不再符合标准但可以在N3090中找到:
noexcept(*(U*)0 = declval<U>())
Run Code Online (Sandbox Code Playgroud)
该建议被拒绝,因为它没有调用未定义的行为,因为它未被评估:
没有未定义的行为,因为表达式是未评估的操作数.目前尚不清楚拟议的变更会更清楚.
这个理由同样适用于sizeof它的操作数未经评估.
我说没有说明,但我想知道这是否包含在4.1 [conv.lval]部分中,其中说:
由左值表示的对象中包含的值是右值结果.当在sizeof(5.3.3)的操作数内发生左值到右值转换时,不会访问引用对象中包含的值,因为该运算符不会计算其操作数.
它表示不包含所包含的值,如果我们遵循问题232的逻辑意味着没有未定义的行为:
换句话说,它只是"取值"左右转换的行为,触发了不正确或未定义的行为
由于问题尚未解决,这有些推测.
由于您明确要求标准引用 - [expr.sizeof]/1:
操作数是一个表达式,它是一个未评估的操作数(第5章),或带括号的type-id.
[EXPR]/8:
在某些情况下,出现了未评估的操作数(5.2.8,5.3.3,5.3.7,7.1.6.2).未评估未评估的操作数.
因为从不评估表达式(即dereferenciation),所以此表达式不受一些通常违反的约束.仅对该类型进行了检查.实际上,该标准在[dcl.fct]/12中的示例中使用了空引用本身:
一个尾随回型是一种将被更加复杂之前指定最有用的 声明符-ID:
Run Code Online (Sandbox Code Playgroud)template <class T, class U> auto add(T t, U u) -> decltype(t + u);而不是
Run Code Online (Sandbox Code Playgroud)template <class T, class U> decltype((*(T*)0) + (*(U*)0)) add(T t, U u);- 结束说明 ]
| 归档时间: |
|
| 查看次数: |
860 次 |
| 最近记录: |