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();
}
非常感谢您的帮助! :)