Bug 10127 - Проблема при использовании boost
: Проблема при использовании boost
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/boost-regex)
: unstable
: all Linux
: P2 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2006-10-13 10:59 by
Modified: 2008-09-10 21:35 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2006-10-13 10:59:36
Актуальный сизиф. gcc 4.1.1 20060928 (ALT Linux, build 4.1.1-alt9)
Есть следующий код


int main( int argc, char** argv )
{
        try
        {
                boost::regex
re("(\\w+):\\/\\/(([^:]+?)(:(.+))?@)?([^:\\/]+)(:(\\d+))?((\\/.+?)*)(\\?(.+?))?(#(.+))?");
                boost::match_results<std::string::const_iterator> what;

                std::string first("http://breeze@abc.ru/index.php?v=2008#123");

                boost::regex::locale_type loc("ru_RU.cp1251");
//              re.imbue( loc );

                for( int i=0; i<5; ++i )
                {
                        if(
!boost::regex_match(boost::algorithm::trim_copy(first), what, re) ) continue;
                        cerr << "res =  " << what[12].str() << endl;

                        string tmp = boost::algorithm::trim_copy(first);
                        if( !boost::regex_match(tmp, what, re) ) continue;
                        cerr << "res2 =  " << what[12].str() << endl;
                }

                re.imbue( loc );
        }
        catch (std::exception& ex)
        {
                cerr << "UGLY STANDART ERROR: " << ex.what() << endl;
                return -1;
        }
        catch(...)
        {
                cerr << "UGLY ERROR: UNHANDLED EXCEPTION" << endl;
                return -1;
        }

        return 0;
}

Данные код просто парсит URL при помощи boost::regex, есть две проблемы:
1. Строки "res=..." и "res2=..." должны быть одинаковыми, реально получается

res =  keywords=%CC%E5%E3%E0%F4%EE%ED&pad_i╧╟│ь╥╟│ь╥194.67.27.46&version=2008
res2 =
keywords=%CC%E5%E3%E0%F4%EE%ED&pad_id=190905&ip=194.67.27.46&version=2008

т.е. в строке "res=..." присутствует явный мусор

2. Раскоментирование строки re.imbue( loc ); приводит к появлению "Исключение в
операции с плавающей точкой"

PS Возможно я обратился не по адресу - подскажите, куда следует обратиться
Steps to Reproduce:
make && run
------- Comment #1 From 2006-10-13 11:03:54 -------
Прошу прощения - слишком упростил, реально должно быть например так

std::string
first("http://breeze@abc.ru/banner.jsp?keywords=%CC%E5%E3%E0%F4%EE%ED&id=1&ip=1.1.1.1&version=1#123");

при этом получается
res =  keywords=%CC%E5%E3%E0%F4%EE%ED&iи╟Aь╥╟Aь╥.1&version=1
res2 =  keywords=%CC%E5%E3%E0%F4%EE%ED&id=1&ip=1.1.1.1&version=1
------- Comment #2 From 2006-10-16 19:41:44 -------
Первая часть проблемы, скорее всего связана не с boost, а с gcc(Bug 10144), но
вторая часть с imbue() остаётся
------- Comment #3 From 2006-10-16 20:04:14 -------
Пока времени нет подвердить или опровергнуть, до конца недели обещаю 
разобраться.
------- Comment #4 From 2006-11-22 10:59:25 -------
Что-то прояснилось?
------- Comment #5 From 2007-07-29 22:15:24 -------
На новом бусте воспроизводится?
------- Comment #6 From 2008-03-29 14:20:06 -------
В новой версии были исправления на эту тему.