Andrew Troschinetz wrote:
Hello all,
I've got what I suspect is a relatively unique problem that's
resulting in a segfault whenever I try to construct a boost::regex.
First some machine information:
Red Hat Enterprise Linux Server release 5.1 (Tikanga)
Linux 2.6.18-53.el5, SMP, x86_64
gcc 4.1.2 20070626 (Red Hat 4.1.2-14)
boost 1.33.1-10
Hello!
I tested your example with the latest version of boost and also got
segfault.
krivenok@develop2 18:16:15 /tmp $ cat main.c
#include
#include <iostream>
#include <string>
using namespace std;
int main()
{
string input ("test test1 test2 test3");
string pattern ("\\btest\\b");
erase_regex (input, boost::regex (pattern));
cout << input << endl; // expecting " test1 test2 test3"
return 0;
}
krivenok@develop2 18:16:29 /tmp $ g++ --version
g++ (GCC) 4.1.2 (Gentoo 4.1.2 p1.1)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
krivenok@develop2 18:16:40 /tmp $ uname -a
Linux develop2 2.6.24-gentoo-r8 #1 SMP Tue Jul 15 02:59:02 MSD 2008 i686
Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz GenuineIntel GNU/Linux
krivenok@develop2 18:16:44 /tmp $ g++ -g -m32 -malign-double -O3 -Wall
-I/usr/local/dev/boost-1.37.0/include/
-L/usr/local/dev/boost-1.37.0/lib/ main.c -lboost_regex-gcc41-mt
krivenok@develop2 18:17:00 /tmp $
LD_LIBRARY_PATH=/usr/local/dev/boost-1.37.0/lib:$LD_LIBRARY_PATH ldd
./a.out
linux-gate.so.1 => (0xb7f34000)
libboost_regex-gcc41-mt-1_37.so.1.37.0 =>
/usr/local/dev/boost-1.37.0/lib/libboost_regex-gcc41-mt-1_37.so.1.37.0
(0xb7e61000)
libstdc++.so.6 =>
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libstdc++.so.6 (0xb7d61000)
libm.so.6 => /lib/libm.so.6 (0xb7d3b000)
libgcc_s.so.1 =>
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/libgcc_s.so.1 (0xb7d2f000)
libc.so.6 => /lib/libc.so.6 (0xb7bff000)
libicudata.so.38 => /usr/local/equipment/lib/libicudata.so.38
(0xb7127000)
libicui18n.so.38 => /usr/local/equipment/lib/libicui18n.so.38
(0xb6fc9000)
libicuuc.so.38 => /usr/local/equipment/lib/libicuuc.so.38
(0xb6ea4000)
librt.so.1 => /lib/librt.so.1 (0xb6e9b000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb6e84000)
/lib/ld-linux.so.2 (0xb7f35000)
krivenok@develop2 18:17:05 /tmp $
LD_LIBRARY_PATH=/usr/local/dev/boost-1.37.0/lib:$LD_LIBRARY_PATH ./a.out
Segmentation fault
krivenok@develop2 18:17:11 /tmp $
LD_LIBRARY_PATH=/usr/local/dev/boost-1.37.0/lib:$LD_LIBRARY_PATH gdb
./a.out
GNU gdb 6.7.1
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-pc-linux-gnu"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) r
Starting program: /tmp/a.out
warning: Lowest section in /usr/local/equipment/lib/libicudata.so.38 is
.hash at 000000f4
[Thread debugging using libthread_db enabled]
[New Thread 0xb6e9c6d0 (LWP 477)]
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb6e9c6d0 (LWP 477)]
boost::re_detail::basic_regex_parser >::parse_extended (this=0xbfcff47c)
at
/usr/local/dev/boost-1.37.0/include/boost/regex/v4/basic_regex_parser.hpp:247
247 switch(this->m_traits.syntax_type(*m_position))
Current language: auto; currently c++
(gdb) bt
#0 boost::re_detail::basic_regex_parser >::parse_extended (this=0xbfcff47c)
at
/usr/local/dev/boost-1.37.0/include/boost/regex/v4/basic_regex_parser.hpp:247
#1 0xb7ef6476 in boost::re_detail::basic_regex_parser >::parse ()
from
/usr/local/dev/boost-1.37.0/lib/libboost_regex-gcc41-mt-1_37.so.1.37.0
#2 0xb7ef8634 in boost::basic_regex >::do_assign ()
from
/usr/local/dev/boost-1.37.0/lib/libboost_regex-gcc41-mt-1_37.so.1.37.0
#3 0x0804f26b in main () at
/usr/local/dev/boost-1.37.0/include/boost/regex/v4/basic_regex.hpp:262
(gdb) q
The program is running. Exit anyway? (y or n) y
krivenok@develop2 18:17:42 /tmp $
Here's a small example that shows the problem:
#include
#include <iostream>
#include <string>
using namespace std;
int main()
{
string input ("test test1 test2 test3");
string pattern ("\\btest\\b");
erase_regex (input, boost::regex (pattern));
cout << input << endl; // expecting " test1 test2 test3"
return 0;
}
Compile flags (and this is getting to the heart of the problem, I think):
-g -m32 -malign-double -O3 -Wall -lboost_regex
Put all the above together in a bag, shake it up, and you get this
segfault:
0x08066beb in boost::re_detail::basic_regex_parser
::parse_extended (this=0xffde311c)
at /usr/include/boost/regex/v4/basic_regex_parser.hpp:235
235 switch*this->m_traits.syntax_type(*m_position))
(gdb) print m_position
$1 = 0x0
(gdb) bt
#0 0x08066beb in boost::re_detail::basic_regex_parser
::parse_extended
at /usr/include/boost/regex/v4/basic_regex_parser.hpp:235
#1 0xf7f9e364 in boost ::re_detail::basic_regex_parser >::parse ()
from /usr/lib/libboost_regex.so.2
#2 0xf7fa0eba in boost::basic_regex >::do_assign () from
/usr/lib/libboost_regex.so.2
#3 0x08050789 in main () at
/usr/include/boost/regex/v4/basic_regex.hpp:254
So the immediate culprit is a dereferencing-null problem.
Interestingly, the problem goes away at -O, -O1, and -O2. Or -O3 but
without -malign-double.
The same results.
I was wondering if this is a known problem, and if anyone else who's
hand is forced to compile with -malign-double has seen this problem
and been able to work around it?
--
Andrew Troschinetz
Applied Research Laboratories
_______________________________________________
Boost-users mailing list
Boost-users@lists.boost.org
http://lists.boost.org/mailman/listinfo.cgi/boost-users
--
Sincerely yours, Dmitry V. Krivenok
Orange System Company
Saint-Petersburg, Russia
work phone: +7 812 332-32-40
cellular phone: +7 921 576-70-91
e-mail: krivenok@orangesystem.ru
web: http://www.orangesystem.ru
skype: krivenok_dmitry
jabber: krivenok_dmitry@jabber.ru
icq: 242-526-443