在CentOS 6.4上使用Boost.Regex 1.53和gcc 4.8.1随机断言失败



以下是我正在使用的测试正则表达式的代码:

#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的null shared_ptr。它似乎是随机发生的,如图所示:

[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_errors,所以我不能使用它。

(我知道isMatch在这个例子中不需要是lambda,甚至不需要是真正的函数,但在我的非人工代码中,这样做是有原因的。)

正如所指出的,问题是安装了两个不同版本的Boost。然而,如何解决问题的步骤在建议的问题中没有得到的解决。以下是我必须做的:

  1. 删除系统打包的Boost库(我不知道是否真的需要这个步骤,因为我必须执行以下两个步骤):

    sudo yum remove boost-devel

  2. 删除所有剩余的Boost库:

    sudo find /usr -name 'libboost_*' -delete

  3. 删除所有剩余的Boost包括Boost文件夹本身:

    sudo rm -rf /usr/include/boost

  4. 重新安装Boost 1.53(从上方):

    ./bootstrap.sh --prefix=/usr

    sudo ./b2 install

在我的情况下,我还必须更新LD_LIBRARY_PATH以指向/usr/lib,因为该变量以前根本不存在。

无论如何,代码现在可以工作了。每次。根本没有运行时错误。

最新更新