不执行的代码会导致分段错误吗?

Can code that doesn't execute cause segmentation fault?

本文关键字:分段 错误 执行 代码      更新时间:2023-10-16

我有这段代码工作得很好。if中的陈述是正确的,这导致我打印TRUE。但是,当我删除else语句的内容时,即使它没有执行(仍然打印TRUE(,这也给了我分段错误。

有谁知道为什么会这样吗?

if(parser->checkToken(Token::Type::Int)) {
        std::cout << "TRUE" << std::endl;
        parser->scanner->getToken().getNumber();
        parser->advance();
} else {
        std::cout << "FALSE" << std::endl;
        parser->requireToken(Token::Type::String);
}

附言解析器unique_ptr

不,不执行的代码不会导致分段错误。

其他一些代码(在您显示的代码之前执行(将是原因。

其他代码表现出未定义的行为(根据C++标准中"未定义"的含义(,并覆盖某些不应该覆盖的内存区域。 从代码中删除else块可能会导致实现(编译器、链接器等(重构程序及其使用的数据在内存中的布局方式(例如,代码和数据在内存中的位置(。 反过来,这可以改变有问题的代码覆盖内存的效果(例如,它更改是否使用覆盖的内存来存储变量,或者它是操作系统认为程序不应访问的内存的某些区域(。

如果没有看到完整的代码,很难说,但我的猜测是

parser->scanner->getToken().getNumber();
parser->advance();

(或此处未附加的其他代码(具有与之相关的某种未定义的行为,并且您在else部分遇到分段错误只是运气问题(是的,您在这方面很幸运。想想如果你无法重现它会发生什么(。

尝试查看scannergetToken()getNumber()在其实现中执行的操作,并找到可能导致未定义行为的任何操作(也许getToken()返回对函数内初始化的对象的引用?

当然可以。

添加/减去代码,因此它是关联的数据,将内存中的内容移动到不同的地方,即使在一种情况下,代码实际上并没有自行执行。

如果你的代码有未定义的行为,上面可以在"工作"、崩溃、鼻魔等之间切换进程的操作。