【发布时间】:2015-04-27 03:38:20
【问题描述】:
首先,我看到this question about C99 和接受的答案引用操作数未评估 C99 标准草案中的措辞。我不确定这个答案是否适用于 C++03。还有 this question about C++ 有一个接受的答案,引用了类似的措辞,而且 在某些情况下,会出现未计算的操作数。未计算的操作数不会被计算。 措辞。
我有这个代码:
int* ptr = 0;
void* buffer = malloc( 10 * sizeof( *ptr ) );
问题是 - sizeof() 内部是否存在空指针取消引用(以及 UB)?
C++03 5.3.3/1 说 sizeof 运算符在其操作数的对象表示中产生字节数。操作数要么是一个未计算的表达式,要么是一个带括号的类型 ID。
链接到答案引用这个或类似的措辞,并利用“未评估”部分来推断没有 UB。
但是,在这种情况下,我无法找到标准将 评估 与拥有或不拥有 UB 的确切位置联系起来。
“不评估”应用了 sizeof 的表达式是否使得在 C++ 中取消引用 sizeof 内的 null 或无效指针是合法的?
【问题讨论】:
-
@ParkYoung-Bae 这并没有多大帮助。
-
@juanchopanza 我想知道这些问题在哪里有我的答案吗?谢谢。
-
@ParkYoung-Bae 认真的吗?它引用了以下内容:“在某些情况下,会出现未计算的操作数。未计算的操作数不会被计算。”
-
我重新打开了,但我不确定标准是否必须明确说明未评估的操作数不会导致 UB。
-
IMVHO 行为(无论是否定义)发生在执行过程中,因此只能由执行语句或评估表达式引起。如果不计算表达式,则表达式不会导致任何行为,例如
if(0) { int*p; *p = 0;}。
标签: c++ language-lawyer sizeof undefined-behavior null-pointer