这段代码是否有效(和定义的行为)?
int &nullReference = *(int*)0;
Run Code Online (Sandbox Code Playgroud)
这两个g ++以及铛++编译它没有任何警告,即使使用-Wall,-Wextra,-std=c++98,-pedantic,-Weffc++...
当然,引用实际上不是null,因为它无法访问(这意味着取消引用空指针),但我们可以通过检查其地址来检查它是否为null:
if( & nullReference == 0 ) // null reference
Run Code Online (Sandbox Code Playgroud) 我目前正在使用一个使用代码的库
T& being_a_bad_boy()
{
return *reinterpret_cast<T*>(0);
}
Run Code Online (Sandbox Code Playgroud)
在没有实际存在T的情况下引用T.这是未定义的行为,特别指出标准不支持,但它不是闻所未闻的模式.
我很好奇是否有任何示例或平台或用法表明在实践中这可能会导致问题.谁能提供一些?
首先,我已经看到了关于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或无效指针是合法的吗?