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> ¶m) { 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
Post a Comment