On 11/16/2015 05:53 PM, Guillaume Munch wrote: > Le 16/11/2015 20:22, Georg Baum a écrit : >> Richard Heck wrote: >> >>> >>> Recipe: >>> >>> 1. Open the User Guide. >>> 2. Click somewhere in the main text. >>> 3. Insert > Citation >>> 4. Enter the search field and type "cap" >>> 5. Hit search button. >>> >>> Error: Software exception Detected >>> ---------------------------------------- >>> LyX has caught an exception, it will now attempt to save all unsaved >>> documents and exit. >>> >>> Exception: regex_error >>> >>> This is on Fedora 22, gcc 5.1.1, with configuration as: >>> --enable-build-type=dev. >>> >>> The offending code is this assignment >>> >>> static const lyx::regex reg("[].|*?+(){}^$\\[\\\\]"); >>> >>> in escape_special_characters in GuiCitation.cpp. I would guess that >>> this >>> is a consequence of changes to the regex engine. >> >> I can reproduce with gcc 5.1 in C++11-mode. This is most likely the same >> problem as http://www.lyx.org/trac/ticket/9799, since the test fails >> as well >> for the same compiler, so I guess it happens with gcc4 in C++11 mode as >> well. Nice to see that the unit test worked! Now we only need to >> learn not >> to ignore failing unit tests. >> >> Some regex expert needs to find out whether the regex syntax we are >> using is >> only valid for boost::regex or for C++11 std::regex as well, and >> depending >> on the outcome we either need to change our regex, or file a gcc bug. Or >> maybe it is some multithreading issue? The 'static' rings some alarm >> bells... >> >> > > If I may try to explain with my own words (because I really didn't get > your reasoning at first, being far from being a C++ regex expert). > Std::regex and boost::regex do not set the same regex style by default > (perl vs ECMAScript) but both support other styles by passing the > appropriate flag. The commit 4620034e already had fixed a crash a > while ago due the use of (what is now) std::regex in MSVC, by passing > automatically the flag to set the "grep" regex style instead of > ECMAScript. > > But, in 394e1bf9 you did without passing this flag. The reason, if I > reconstruct correctly, is that std's ECMAScript style is only supposed > to be boost's perl style minus a few perl-isms; we shouldn't have to > set a style "grep" (that may even change the meaning of regexes!). The > most sensible cross-platform solution is to conform to the ECMAScript > subset, and if I infer correctly this is what you mean. > > Once this is understood, we go to the ECMAScript standard and realize > that "[]" is interpreted as the empty class in ECMAScript. "[]…]" is a > perl-ism, and ] should be escaped. > > Lesson for everybody apart from Georg: please write regexes according > to the ECMAScript standard in the future, even if boost is happy with > your perl-isms. > > Here's a patch that locates a similar issue elsewhere. I did my fair > share of the exercise, can I please let other people test it and > commit the appropriate solution?
I can confirm that this fixes the original crash. I didn't check the ExternalTransforms part of it, as I'm not sure how to do that, but one would suppose it was right, too. Richard