[英]Assertion failure at random with Boost.Regex 1.53 and gcc 4.8.1 on CentOS 6.4
這是我用來測試正則表達式的代碼:
#include <iostream>
#include <boost/regex.hpp>
//#include <regex>
#include <functional>
#include <string>
int main(int argc, char** argv)
{
auto isMatch = [](const std::string& text, const std::string& pattern)->bool
{
return boost::regex_search(text,
boost::regex(pattern, boost::regex::icase | boost::regex::nosubs)
);
};
std::cout << std::boolalpha << isMatch("Hello, world!",
R"(((\%3D)|(=))[^\n]*((\%27)|(\')|(\-\-)|(\%3B)|(;)))") << std::endl;
return 0;
}
該代碼可以很好地編譯,但是當我運行它時, 有時我會斷言失敗,因為我可以放心地假設它是一個null shared_ptr,不應將其視為null。 似乎隨機發生,如下所示:
[jacktrueborn@inpost regextest]$ ./regextest
false
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
false
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
false
[jacktrueborn@inpost regextest]$ ./regextest
false
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
false
[jacktrueborn@inpost regextest]$ ./regextest
false
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
false
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
regextest: /usr/include/boost/smart_ptr/shared_ptr.hpp:646: typename boost::detail::sp_dereference<T>::type boost::shared_ptr<T>::operator*() const [with T = boost::regex_traits_wrapper<boost::regex_traits<char> >; typename boost::detail::sp_dereference<T>::type = boost::regex_traits_wrapper<boost::regex_traits<char> >&]: Assertion `px != 0' failed.
Aborted (core dumped)
[jacktrueborn@inpost regextest]$ ./regextest
false
[jacktrueborn@inpost regextest]$
這就是我安裝boost的方法:
./bootstrap.sh --prefix=/usr
sudo ./b2 install
我知道過去該庫一直是個問題,我一直找不到令人滿意的解決方法。 我想知道是否有人浮出水面,但我還沒有看到。 但是,考慮到錯誤的不穩定性質,我不確定我是否也遇到同樣的問題。 std::regex
只是在運行時拋出std::regex_error
,所以我不能使用它。
(我知道在這種情況下,isMatch不必是lambda甚至是真正的函數,但是在我的非人為代碼中,這樣做是有原因的。)
如前所述,問題是安裝了兩個不同版本的Boost。 但是,建議的問題未解決解決問題的步驟 。 這是我必須要做的:
刪除系統打包的Boost庫(由於必須執行以下兩個步驟,我不知道是否實際上需要執行此步驟):
sudo yum remove boost-devel
刪除所有剩余的Boost庫:
sudo find /usr -name 'libboost_*' -delete
刪除所有剩余的Boost,包括Boost文件夾本身:
sudo rm -rf /usr/include/boost
從上面重新安裝Boost 1.53:
./bootstrap.sh --prefix=/usr
sudo ./b2 install
就我而言,我還必須更新LD_LIBRARY_PATH
以指向/usr/lib
因為該變量甚至以前都不存在。
無論如何,該代碼現在都可以使用。 每次。 完全沒有運行時錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.