2014-01-24 1 views
1

나는 '그래서 내가 할 수있는 내가 표준이없는 (다음 프로그램 중 하나는 정규 표현식을 컴파일 또는 다른 법률로 취급하고 고급 컴파일 할 수없는 불평한다 그림 표현이 엄격하게 합법적인지 여부를 확실히 말하며, 확실히 합리적인 해석이 가능함). 어쨌든, 어떤 g++ (Ubuntu/Linaro 4.8.1-10ubuntu9) 4.8.1에 일이 실행할 때,이 라이브러리의 내장 하드g ++에 정규식 충돌 (아마도 unsyntactic) 표현

*** Error in `./a.out': free(): invalid next size (fast): 0x08b51248 *** 

충돌한다는 것입니다.

질문 :

a) 버그입니까? 정규 표현식을 말하는 아마 (아마 잘못) 가정합니다 : : regex 구문을 좋아하지 않는 경우 충돌이 발생할 수 있습니다. (버그가 있다면),보고되었는지 아닌지를 쉽게 알 수있는 방법이 있습니까? (처음 GNU-Land 버그 시스템을 처음 접하는 것이 겁 먹었습니다) b? |

#include <iostream> 
#include <regex> 

int main(void) 
    { 
    const char* Pattern = "^(%%)|"; 
    std::regex Machine; 

    try { 
     Machine = Pattern; 
     } 
    catch(std::regex_error e) 
     { 
     std::cerr << "regex could not compile pattern: " 
      << Pattern << "\n" 
      << e.what() << std::endl; 
     throw; 
     } 

    return 0; 
    } 
+0

나는 무엇을 할 일은 아무것도 일치하는 것입니다 때문에 당신이, 정규식 파서에 버그가있어 말 것입니다. 파이프 문자는 정규 표현식 파서가 양쪽의 표현식과 일치하도록 지시합니다. 귀하의 경우 오른쪽이 비어 있으므로 아무것도 일치해야합니다. 나는 당신이 pipe charcher를 따라하기를 원했기 때문에 그것을 벗어나서 작동해야한다. – ClasG

+0

Btw, 그냥 정규식 테스트 또는 무엇을하려고합니까? – ClasG

+2

'는'GCC-4.8.1의 된 libstdC++의 비 기능적이었다. LLVM의 libC++를 사용할 수 있다면 [프로그램 작동] (http://coliru.stacked-crooked.com/a/e061305dca0676ba)을 사용하십시오. ? 빈 인수가 엡실론 (제로 문자)와 일치하는 데 사용과'효과적으로하지 않고''연산자를 제공 | - 그렇지 않으면 (너무 오래 켄 톰슨의 멋진 알고리즘이 출판 된 후하지 않음),'는 옛날에 – Cubbi

답변

1

내가 코멘트에 넣고 싶지만, 그럴 수 없습니다, 그래서 ... 당신이 이미 알고있는 경우

는 나도 몰라,하지만 파이프 것 같다 문제의 원인이되는 문자. 그것은 문자 표현처럼 보인다 | ("^ (%%) | a"가 나에게 잘 작동하기 때문에) g ++에 의해 주어진 마지막 문자는 정규 표현식이 free()를 호출하려고 할 때 엉망이되고있다. "|"

28.8 
Class template basic_regex 
[re.regex] 

1 For a char-like type charT, specializations of class template basic_regex represent regular expressions 
constructed from character sequences of charT characters. In the rest of 28.8, charT denotes a given char- 
like type. Storage for a regular expression is allocated and freed as necessary by the member functions of 
class basic_regex. 

2 Objects of type specialization of basic_regex are responsible for converting the sequence of charT objects 
to an internal representation. It is not specified what form this representation takes, nor how it is accessed by 
algorithms that operate on regular expressions. 
[ Note: Implementations will typically declare some function 
templates as friends of basic_regex to achieve this — end note ] 

과 이상을,

basic_regex& operator=(const charT* ptr); 

3 Requires: ptr shall not be a null pointer. 

4 Effects: returns assign(ptr). 

그래서 const를 숯불 * 패턴을 생각 ++ g 않는 =

표준을 (또는 적어도 내가 읽고 있어요 온라인 초안) 주장 ; null ptr입니다 (나는 상상할 수 없을 것입니다 ...), 그것이 버그 인 것 같습니까?

편집 : 덧붙여, 연속 || (심지어 끝이 아닐지라도) 나를 위해 세분화 오류를 일으키는 것 같다.

+0

아마 내가 얻는 것만 큼 좋은 대답 일 겁니다. 최소한 정규식 구문 오류가 "정의되지 않은 동작"으로 분류되지 않는다는 나의 확신을지지합니다. –

+0

그래서 다른 사람들의 의견에 대해서도 언급 할 수는 없지만 @Cubbi에 대한 귀하의 의견에 관해서는 어제 클러스터에 gcc-4.8.2를 root 권한없이 내 $ HOME/gcc 디렉토리에 설치하는 방식으로 싸웠습니다. 당신이 아직도 그걸 할려고한다면 내가 도울 수 있니? – chrisb2244