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



yaml-cpp 团队和每个人,

我们的产品从云服务提供商接收不固定大小的 json 响应。我们目前使用初始大小为 16KB 的缓冲区来接收它,然后将其传递给 yaml 解析器(我们使用 yaml-0.2.7(。如果 json 文档在解析过程中不完整,我们希望 yaml 解析器会引发异常,我们将缓冲区的大小加倍。

今天,我们在执行解析器时遇到了一个断言,它显示"断言失败:(!m_tokens.empty(((,函数窥视,文件 .../yaml-cpp-0.2.7/src/scanner.cpp,第 41 行"。获取下一个文档(文档(。由于接收缓冲区较小,json 文档不完整。

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

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

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

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();
}

非常感谢您的帮助! :)

这在 0.5.3 中得到了修复,尽管我不确定它是什么时候修复的。我为您的示例添加了测试,它们按预期通过了(通过抛出异常(。

最新更新