On Mon, Nov 16, 2015 at 10:53:17PM +0000, 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.

Thanks for making a summary of this, Guillaume.

> 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.

Should we add this piece of advice (once confirmed) to Development.lyx?
It is still not exactly clear to me what that document is for, but I
personally would like guidelines like this in there.

> 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 test compilation and 'make check' for different compilation
settings (with/without monolithic build, with/without NLS, clang/gcc). I
am still working on a script to automate that though so I would prefer
first to wait for someone else to check your patch logically.

Scott

Attachment: signature.asc
Description: PGP signature

Reply via email to