On 11/17/2015 01:07 PM, Guillaume Munch wrote:
> Le 17/11/2015 17:07, Richard Heck a écrit :
>> 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.
>>
>
> I am happy to commit that if that's what you want.

Yes, I think you can go ahead.

Richard


Reply via email to