yaml-0.2.7 GetNextDocument()在Scanner :: peek中命中断言失败

时间:2016-02-17 06:39:10

标签: yaml-cpp

yaml-cpp团队和大家,

我们的产品从云服务提供商处收到不固定大小的json响应。我们目前使用一个初始大小为16KB的缓冲区来接收它,然后将它传递给yaml解析器(我们使用的是yaml-0.2.7)。我们希望yaml解析器在解析期间如果json文档不完整则抛出异常,我们会将缓冲区的大小加倍。

今天,我们点击一​​个断言,显示“断言失败:(!m_tokens.empty()),函数偷看,文件...... / yaml-cpp-0.2.7 / src / scanner.cc,第41行。”在做parser.GetNextDocument(doc)时。由于接收缓冲区很小,json文档不完整。

在检查缓冲区并进行一些实验后,我发现在某个模式之后是否缺少某些字符,扫描仪中的断言将在GetNextDocument期间被命中。例如对于'{“访问”:“abc”}',如果缺少最后的'}',那么断言将被命中。如果是“{”访问“:”或“{”访问“',则会发生同样的事情。如果它是“{”访问“:”abc'(注意abc没有尾随的双引号),它将不会触及断言。

如果我升级到最新的0.5.3版本会有帮助吗?我查看了源代码,看到Scanner :: peek函数中的相同断言仍然存在。

以下是命令断言的函数的源代码:

Token& Scanner::peek() {
{
    EnsureTokensInQueue();
    /** THIS ONE GOT HIT **/
    assert(!m_tokens.empty());  // should we be asserting here? I mean, we really just be checking
                                // if it's empty before peeking.
#if 0
    static Token *pLast = 0;
    if(pLast != &m_tokens.front())
        std::cerr << "peek: " << m_tokens.front() << "\n";
    pLast = &m_tokens.front();
#endif

    return m_tokens.front();
}

非常感谢您的帮助! :)

1 个答案:

答案 0 :(得分:0)

这是在0.5.3中修复的,虽然我不确定它何时被修复。我添加tests for your examples并按预期通过(通过抛出异常)。