c++ - boost::regex_search and replace valgrind errors -


i having lot of error valgrind when i'm trying search , replace data in string using boost::regex. i'm getting correct output i'm bit scared of errors

the thing funny it's when comment line replace i'm not getting errors coming line search.

so have following function

  static void    replacevar(std::string & input, std::map<std::string, template_param> &param)   {     boost::regex ex(regex_tag);     boost::match_results<std::string::const_iterator> extend;     std::string::const_iterator start, end;     boost::match_flag_type flags;      start = input.begin();     end = input.end();     flags = boost::match_default;     while (boost::regex_search(start, end, extend, ex, flags)) // line 78       {         try           {             const std::string *ptr = tools::visitor_fct<std::string>(param.at(extend[1])); // line working fine             if (ptr != nullptr)               input = boost::regex_replace(input, ex, *ptr, boost::match_default | boost::format_first_only); //line 84           }         catch (const std::out_of_range& err)           {             input = boost::regex_replace(input, ex, std::string(""), boost::match_default | boost::format_first_only);           }         start = extend[0].second;         end = input.end();         flags |= boost::match_prev_avail;         flags |= boost::match_not_bob;       }   } 

i'm getting following output valgrind

==21743== thread 2: ==21743== invalid read of size 1 ==21743==    @ 0x54c24b0: boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::find_restart_any() (in /usr/local/lib/libboost_regex.so.1.53.0) ==21743==    0x54d83ba: boost::re_detail::perl_matcher<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, boost::regex_traits<char, boost::cpp_regex_traits<char> > >::find_imp() (in /usr/local/lib/libboost_regex.so.1.53.0) ==21743==    0x4badb7: bool boost::regex_search<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(__gnu_cxx::__normal_iterator<char const*, std::string>, __gnu_cxx::__normal_iterator<char const*, std::string>, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags, __gnu_cxx::__normal_iterator<char const*, std::string>) (regex_search.hpp:56) ==21743==    0x4f40d7: bool boost::regex_search<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > >, char, boost::regex_traits<char, boost::cpp_regex_traits<char> > >(__gnu_cxx::__normal_iterator<char const*, std::string>, __gnu_cxx::__normal_iterator<char const*, std::string>, boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::string>, std::allocator<boost::sub_match<__gnu_cxx::__normal_iterator<char const*, std::string> > > >&, boost::basic_regex<char, boost::regex_traits<char, boost::cpp_regex_traits<char> > > const&, boost::regex_constants::_match_flags) (regex_search.hpp:42) ==21743==    0x4f2bb4: ... line 78 

and

==21743==  address 0x6543315 197 bytes inside block of size 293 free'd ==21743==    @ 0x4c2a4bc: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==21743==    0x57ebc12: std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.16) ==21743==    0x4f2b0c: (l:84) 

i think it's @ assignment create errors because when put only

boost::regex_replace(input, ex, *ptr, boost::match_default | boost::format_first_only); //line 84 

i don't valgrind errors

i have tried create new string output of regex_replace , assign ouput i'm still getting errors

any ideas ?

to remove errors valgrinds had restart loop each @ each change because end , begin of string wasn't same.

so changed loop to

 bool flag = true;  while (flag)   {     flag = false;     start = input.begin();     end = input.end();     while (boost::regex_search(start, end, extend, ex, boost::match_default))       {         try           {             const std::string *ptr = tools::visitor_fct<std::string>(param.at(extend[1]));             if (ptr != nullptr)               input = boost::regex_replace(input, ex, *ptr, boost::match_default | boost::format_first_only);           }         catch (const std::out_of_range& err)           {             input = boost::regex_replace(input, ex, std::string(""), boost::match_default | boost::format_first_only);           }         flag = true;         break;       }   } 

and works fine.


Comments

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -