相关疑难解决方法(0)

假定具有未定义行为的分支是否无法访问并优化为死代码?

请考虑以下声明:

*((char*)NULL) = 0; //undefined behavior
Run Code Online (Sandbox Code Playgroud)

它明确地调用未定义的行为.在给定的程序中是否存在这样的语句意味着整个程序是未定义的,或者一旦控制流命中这个语句,该行为只会变得不确定?

如果用户从未输入数字,3是否可以明确定义以下程序?

while (true) {
 int num = ReadNumberFromConsole();
 if (num == 3)
  *((char*)NULL) = 0; //undefined behavior
}
Run Code Online (Sandbox Code Playgroud)

或者,无论用户输入什么,它都是完全未定义的行为?

此外,编译器是否可以假定在运行时永远不会执行未定义的行为?这样可以及时推理:

int num = ReadNumberFromConsole();

if (num == 3) {
 PrintToConsole(num);
 *((char*)NULL) = 0; //undefined behavior
}
Run Code Online (Sandbox Code Playgroud)

在这里,编译器可以推断,以防num == 3我们总是调用未定义的行为.因此,这种情况必须是不可能的,并且不需要打印该号码.整个if声明可以优化.根据标准,是否允许这种向后推理?

c++ dead-code undefined-behavior language-lawyer unreachable-code

88
推荐指数
3
解决办法
3338
查看次数

在这种情况下,C++会在编译时进行数组边界检查吗?

受到" 使用编译时HTML解析的C++ HTML模板引擎 "的想法的启发,我试图编写一个示例类来检查字符串中的第一个字符是否是a.

int dummy[0];
class Test
{
public:
    constexpr Test(const char *p):p_(p){}
    constexpr void check()const
    {
        if (p_[0]!='a')
            dummy[1]=0;
    }
    const char *p_;
};


constexpr Test operator"" _test(const char *pszText, size_t)
{
  Test t(pszText);
  t.check();
  return t;
}


int main()
{
    //dummy[1] = 0;
    constexpr Test t = "baa"_test;
}
Run Code Online (Sandbox Code Playgroud)

它运行良好(UCCntu上的GCC7.1).如果第一个char不是a,它将给出编译错误:

main.cpp:29:24: error: array subscript value ‘1’ is outside the bounds
of array ‘dummy’ of type ‘int [0]’
constexpr Test t = "baa"_test;
Run Code Online (Sandbox Code Playgroud)

令我感到困惑的是,如果我将代码更改为: …

c++ arrays indexoutofboundsexception c++11

5
推荐指数
1
解决办法
861
查看次数