문제

최근에 일부 레거시 코드에 대한 단위 테스트를 만들려고 노력했습니다.

나는 링커를 사용하여 어떤 기능이 링크 오류를 일으키는지를 보여주고 소스를 찾아 정의를 찾아서 그로부터 스터브를 생성하는 접근 방식을 취해 왔습니다.

더 쉬운 방법이 있습니까? 스터브를 생성 할 수있는 수업 정의, 사용하기 쉬운 형태로 클래스 정의를 줄 수있는 일종의 C ++ 파서가 있습니까?

도움이 되었습니까?

해결책

당신은 조사하고 싶을 수도 있습니다 http://os.inf.tu-dresden.de/vfiasco/related.html#parsing. 그러나 C ++ 구문 분석은 어렵습니다.

반면에, 아마도 ctags 또는 비슷한 것이 클래스 정의를 추출 할 수 있습니다 ...

헤더 파일에서 클래스 스터브를 생성하기 위해 자신만의 간단한 (?) 파서를 작성하려고 할 수도 있습니다.

나는 당신에게 몇 가지 포인터를 주려고 노력했습니다. 보시다시피, 문제는 쉽지 않습니다. 그러나 바라건대 당신은 그것의 적어도 일부를 자동화 할 수 있기를 바랍니다.

다른 팁

GCC XML 같은 일부 프로젝트에서 사용됩니다 공통 LISP 용 자동 FFI.소스를 나타내는 XML을 생성하기 위해 G ++ 컴파일러와 연결됩니다. 여기에서 XML 처리 도구가 목표에 도달하는 데 도움이 될 수 있습니다.

그만큼 Abi-Compliance-Checker 도구는 C/C ++ 헤더 파일의 구문 분석기로 사용할 수 있습니다.

abi-compliance-checker -lib NAME -dump VER.xml -headers-only -xml -stdout > api.xml

VER.xml 입력 파일은 다음과 같습니다.

<version>
  1.0
</version>

<headers>
  /path1/to/header(s)/
  /path2/to/header(s)/
   ...
</headers>

출력 api.xml 파일에는 구성된 형태의 기능 서명 및 헤더 파일의 기타 정보가 포함되어 있습니다.

...
<symbol>
    <id>37348</id>
    <mangled>_ZN7MWidget11qt_metacallEN11QMetaObject4CallEiPPv</mangled>
    <short>qt_metacall</short>
    <class>13749</class>
    <header>mwidget.h</header>
    <line>45</line>
    <return>44</return>
    <spec>virtual</spec>
    <parameters>
        <param>
            <name>p1</name>
            <type>4078</type>
            <algn>4</algn>
            <pos>0</pos>
        </param>
        <param>
            <name>p2</name>
            <type>44</type>
            <algn>4</algn>
            <pos>1</pos>
        </param>
        <param>
            <name>p3</name>
            <type>3905</type>
            <algn>8</algn>
            <pos>2</pos>
        </param>
    </parameters>
</symbol>
...

정보에 대한 정보도 참조하십시오 Api-Sanity-Checker 도구, 헤더 파일의 선언 분석을 통해 API의 모든 기능에 대한 기본 단위 테스트 케이스를 생성 할 수 있습니다.

http://clang.llvm.org/ 유망 해 보이지만 불완전합니다.

http://www.boost.org/doc/libs/1_36_0/libs/python/pyste/index.html GCCXML을 사용하여 C ++ 코드를위한 랩퍼를 인터페이스 파이썬으로 생성합니다. 이것은 GCCXML이 유사한 개념에 사용되었음을 증명합니다.

드워프 디버깅 형식 (주로 UNIX)을 사용하는 APLATFORM을 사용하는 경우 libdWarf를 사용하여 디버깅 정보를 구문 분석하고 모든 것에 대한 정보 (기능 프로토 타입, 클래스 정의 등)를 추출 할 수 있습니다. C ++보다 훨씬 더 구조적이고 구문 분석하기 쉽습니다.

Doxygen은 일반적으로 C ++를 충분히 구문 분석하여 코드에 대한 문서를 작성할 수 있습니다. 또한 XML 출력 옵션도 있습니다.

당신은 봤어? mockcpp, 걸레 그리고 mockpp ? 당신은 그들이 당신의 요구에 맞지 않으면 그들이 C ++를 구문 분석하는 방법을 볼 수 있습니다.

Eclipse CDT 프로젝트는 고급 C ++ 파서를 제공합니다. 인터페이스는 매우 쉽습니다. 다음 코드 스 니펫은 충분한 힌트를 줄 수 있습니다.

ItranslationUnit tu = Coremodelutil.FindTranslationUnit (파일);
icelement [] elements = tu.getchildren ();

istructure 구조 = (istructure) 요소;
imethoddeclaration [] method = stuction.getMethods ();
ifield [] field = stuction.getfields ();

Windows 플랫폼에 있다면 Microsoft Phoenix 프로젝트. 컴파일 프로세스의 모든 단계에 연결할 수있는 새로운 컴파일러 프레임 워크입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top