[英]Boost Spirit parser crashes on input
我有一個使用qi::double_
數字解析器的boost精神解析器。 我有用戶的數據包含一個uuid字符串的情況:
"00573e443ef1ec10b5a1f23ac8a69c43c415cedf"
我在下面的精神pow10_helper()
函數中遇到了崩潰。 對於任何以數字后跟e
和另一個數字開頭的字符串,似乎會發生更多測試。 例如1e999
也崩潰了。 要重現崩潰,請嘗試:
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main()
{
double x;
std::string s = "1e999";
auto a = s.begin();
auto b = s.end();
qi::parse(a, b, qi::double_, x); // <--- crash/assert in debug mode
}
我正在使用精神,因為它的原始性能( qi::double_
比strtod()
大約快2倍)。 我的問題是,有沒有辦法解決這個限制? 切換到較慢的解析器會很痛苦,但如果您有特別的建議,請告訴我。
相關的boost/spirit/home/support/detail/pow10.hpp
代碼崩潰( boost/spirit/home/support/detail/pow10.hpp
)供參考:
template <>
struct pow10_helper<double>
{
static double call(unsigned dim)
{
static double const exponents[] =
{
1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
...
1e300, 1e301, 1e302, 1e303, 1e304, 1e305, 1e306, 1e307, 1e308,
};
BOOST_ASSERT(dim < sizeof(exponents)/sizeof(double));
return exponents[dim]; // <--- crash here, dim is 999 which is >308
}
};
作為旁注,這似乎是精神實施中的一個巨大的錯誤。 您應該能夠通過傳入像1e999
這樣的虛擬輸入值輕松地崩潰任何解析雙打的精神應用程序。
這是一個已知問題,已在1_57_0 AFAIR中修復
這是關於它的郵件列表討論:
11月7日Joel de Guzman寫道:
現在,這已經在開發分支中得到了修復,並且浮點精度解析(角落情況)中有一系列改進。 有一些向后不兼容的更改,但它應該只影響那些使用真正的解析器策略的人,特別是那些專門化parse_frac_n的人。 這些變化將在適當的時候記錄。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.