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

时间:2017-05-28 09:56:41

标签: c++

我让这段代码工作得很好。 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);
}

P.S。解析器是unique_ptr

3 个答案:

答案 0 :(得分:0)

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

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

其他代码表现出未定义的行为(根据C ++标准中“未定义”的含义),并且不应覆盖某些内存区域。从代码中删除else块可能导致实现(编译器,链接器等)重构您使用的程序和数据在内存中的布局方式(例如,代码和数据位于内存中)。反过来,这可以改变你的违规代码覆盖内存的影响(例如,它会改变被覆盖的内存是用于存储变量,还是操作认为你的程序不应该访问的内存区域)。 / p>

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:-1)

当然可以。

添加/减去代码,以及它的关联数据,将内存中的内容移动到不同的地方,即使在一种情况下,代码本身并未实际执行。

如果您的代码具有未定义的行为,则上述操作可以在“工作”,崩溃,鼻子恶魔等之间切换您的流程操作。