2016-06-22 1 views
0

clang의 API를 사용하여 소스 코드의 블록 활성을 덤프해야합니다. 블록 활자 인쇄를 시도했지만 아무런 성공도 얻지 못했습니다. 다음은 내가 시도한 코드입니다.덤프 블록 Clang을 사용하여 소스 코드의 활발함

나는 오버라이드 비지 티 함수를 가지고 있으며 함수의 활력을 인쇄하려고했습니다. LiveVariables 객체를 얻기 위해 create, computeLiveness 및 getAnalysis 메서드를 사용해 보았지만 모든 접근이 실패했습니다. 그러나 블록 번호를 제외한 모든 생명 정보는 표시되지 않습니다.

lang의 명령 줄 인수를 사용하여 활성을 인쇄하면 출력이 올바르게 표시됩니다.

Live Variable Analysis Wikipedia 에서 가져온 테스트 사례로 다음 소스 코드를 사용하고 있습니다.

int main(int argc, char *argv[]) 
{ 
    int a,b,c,d,x; 

    a = 3; 
    b = 5; 
    d = 4; 
    x = 100; 

    if(a>b){ 
    c = a+b; 
    d = 2; 
    } 

    c = 4; 
    return b * d + c; 
} 

누군가 내가 잘못 될 수 있음을 지적 할 수 있습니까? 미리 감사드립니다.

답변

0

clang -cc1 -analyze -analyzer-checker=debug.DumpLiveVars의 일부 디버깅 후 동일한 문제가 발생했습니다. 결국 답변을 찾았습니다!

LiveVariables 분석에서는 하위 표현식 (예 : DeclRefExpr)을 단독으로 탐색하지 않습니다. CFG 열거에만 의존합니다. 기본적으로 CFG는 최상위 수준의 명령문 만 열거합니다.

AnalysisDeclContext에서 분석을 받으려면 adc->getCFGBuildOptions().setAllAlwaysAdd()으로 전화해야합니다. 이렇게하면 control-flow-graph의 CFGBlocks에있는 모든 하위 표현식에 대한 요소가 만들어집니다.

+0

고맙습니다. @Quentin 그것이 효과가있었습니다. :) –

+0

그러나 이것은 clang 3.1에서는 작동하지 않습니다. clang 3.8에서 작동합니다. –