2013-10-28 6 views
2

나는 C 프로그램을 가지고 있으며 구체적인 입력에 해당하는 실행 경로에 속한 모든 분기 조건을 추적하려고합니다. a = "1234"주어진 입력으로 프로그램 분석

#include <stdio.h> 
#include <string.h> 
int test(char* a) { 
    if (strcmp(a, "123") == 0) 
     return 0; 

    if (strcmp(a, "123") < 0) 
     return -1; 
    else 
     return 1; 
    } 

    int main() { 
     char* a; 
     return test (a); 
    } 

이 프로그램 1 반환하고 해당 경로 조건 strcmp(a, "123") > 0있다 : 예를 들어, 간단한 프로그램을 고려한다. strcmp, "123" 및이 연산자의 값 (-1)을 수집하려고합니다. 내가 그렇게 할 수있는 방법이 있습니까? 먼저 C 파서로 작업하는 것에 대해 생각했지만 간단하지는 않은 것 같습니다. 매개 변수의 값을 얻으려면 포인터 분석 또는 외부 라이브러리 호출을 처리해야합니다. 이는 해결 방법을 모릅니다.

+0

공구 관련 질문을하고 있습니다. 열성적인 사람들이이를 막을 것입니다. –

+0

@IraBaxter 도구/접근 방법에 대해 묻고 있습니다. :) 아, 편집 할게. –

답변

1

파서가 필요한지 여부는 선택할 수 없습니다. 당신은 그것을 필요로한다 (전체 전처리기를 포함한다). 특히 원하지 않는 것은 파서를 굴리는 것입니다. C는 당신이 생각하기에 더 복잡합니다. 그리고 관심있는 C의 특정 방언을 걱정해야합니다.

하지만 파서만으로는 충분하지 않습니다. 당신은 타입에 대한 선언과 표현식으로 이름을 해석 할 수있는 툴이 필요합니다. 플로우 그래프를 추출 할 수 있고, 분석과 특히 함수 - 포인트 - 투 분석을 할 수있는 포인트가 있습니다. 마지막으로 모든 것을 고려한 콜 그래프를 구성 할 수있는 무언가가 필요합니다. . 즉, 문제를 해결하기 위해 컴파일러와 같은 프레임 워크가 필요합니다.

아마도 GCC (하드, 정말 컴파일러가 되길 원합니다) 또는 Clang (원하는 일이지만 다른 목적을 허용하도록 설계됨)을 수행 할 수 있지만 개별 프로그램을 컴파일하고 싶습니다. C 프로그램은 일반적으로 그런 식으로 구축되기 때문에 일련의 프로그램을 처리 할 수 ​​있습니다. DMS 소프트웨어 리엔지니어링 툴킷은 이러한 유형의 사용자 지정 작업을 지원하도록 특별히 설계되었으며 필요한 모든 기계류를 갖추고 있습니다. (DMS는 또한 C의 특정 방언을 지원합니다).

프레임 워크를 선택하면 관심있는 흐름 경로를 따라 탐색하는 코드가 단순하지 않을 수 있습니다. 일반적인 조언은 "소스 파싱, 위의 모든 분석기 적용, 도구 제공 API를 사용하여 데이터 구조 도보", 제어 흐름 경로를 따르는 API에 특별한 초점을 맞출 것입니다. 이 코드는 모두 예제에 잘 들어 맞지 않습니다. 그리고 그것은 당신이 선택한 프레임 워크에 따라 상당히 다를 것입니다. 나는 GCC 나 Clang의 세부 사항을 속속들이 알고 있지는 않지만, 경로에 대한 상징적 인 설명 (예 : 조건식의 결합)을 적는 쉬운 방법을 제공하지는 않는다고 생각합니다. 디엠에스 (설계 상)에는 이와 같은 기호식을 구성 할 수있는 명시 적 지원이 있다고 말할 수 있습니다.

어떤 경로를 선택하든이 도구를 다루는 방법을 배우는 교육 비용에 직면하게됩니다. 그들은 복잡합니다. 학습 곡선이 상대적으로 길다고 기대하십시오.