簡體   English   中英

Boost Spirit解析器在輸入時崩潰

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM