gpt4 book ai didi

c++ - 一个数字的提升精神解析器的段错误

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:40 24 4
gpt4 key购买 nike

我正在尝试使用 Boost.Spirit。当我测试一个非常简单的解析器时,它必须只解析一个数字,程序崩溃了。

#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>

namespace qi = boost::spirit::qi;

auto const noneZero = qi::char_('1') |
qi::char_('2') |
qi::char_('3');

int main(int argc, char** argv)
{
std::string input = "9";
std::string output;

if (qi::parse(input.begin(), input.end(), noneZero, output))
{
std::cout << "Ok => '" << output << "'\n";
}
else
{
std::cout << "No\n";
}
return 0;
}

我做错了什么?这应该是一个非常简单的案例,我不知道我哪里做错了。

陌生人,如果我写下面的代码一切正常......但为什么?!语法应该相同,不是吗?

#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>

namespace qi = boost::spirit::qi;

auto const noneZero = qi::char_('1', '9');

int main(int argc, char** argv)
{
std::string input = "9";
std::string output;

if (qi::parse(input.begin(), input.end(), noneZero, output))
{
std::cout << "Ok => '" << output << "'\n";
}
else
{
std::cout << "No\n";
}
return 0;
}

更有趣的是,下面的程序没有崩溃:

#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>

namespace qi = boost::spirit::qi;

auto const noneZero = qi::char_('1') |
qi::char_('2');

int main(int argc, char** argv)
{
std::string input = "9";
std::string output;

if (qi::parse(input.begin(), input.end(), noneZero, output))
{
std::cout << "Ok => '" << output << "'\n";
}
else
{
std::cout << "No\n";
}
return 0;
}

有人可以解释为什么这个语法不会崩溃:

auto const noneZero = qi::char_('1') |
qi::char_('2');

为什么这个语法崩溃:

auto const noneZero = qi::char_('1') |
qi::char_('2') |
qi::char_('3');

怀疑我自己的电脑有问题,我在 coliru 上尝试了所有这些示例,结果相同。所有这些示例都是使用以下命令编译的:

clang++ test.cpp -Wall -Werror -Wextra --std=c++14

最佳答案

您正在使用 auto,但没有深度复制 Proto 表达式树。这会产生悬挂引用,因此会产生 Undefined Behaviour。 .

这里有一个修复方法(注意更短的写法):

auto const nonZero = qi::copy(qi::char_("1-3"));

你也可以只写

auto const nonZero = qi::copy(qi::digit - '0');

所有其他“工作”的示例仍然是未定义行为 (UB)。如果你越界,任何事情都可能发生。

现场演示

Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <iostream>
#include <string>

namespace qi = boost::spirit::qi;

auto const nonZero = qi::copy(qi::char_("1-9"));

int main(int argc, char** argv)
{
std::string input = "9";
std::string output;

if (qi::parse(input.begin(), input.end(), nonZero, output))
{
std::cout << "Ok => '" << output << "'\n";
}
else
{
std::cout << "No\n";
}
return 0;
}

打印

Ok => '9'

关于c++ - 一个数字的提升精神解析器的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44661260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com