2011-01-29 6 views
0

나는 C에 대한 추상 인터프리터를 만들려고 노력 중이다. 아마도 전체 문법이 아니라 아마도 그 부분 집합 일 것이다. 나는 이전에 어떤 언어를 사용할 것인지 질문했다. 더 진행하기 전에이 추상 해석이 어떻게 작동하는지 알고 싶습니다.Abstract Interpreter는 어떻게 작동합니까?

나는 위키 링크와 강의 노트 링크를 거쳤습니다. 나는 그것의 이론적 근거와 이론을 이해했다. 나는 내 분석을 해냈다. 내가 완전히 이해할 수없는 부분은 코드를 해석하는 방법입니다. 즉, 초기 코드가 있습니다. 나는 그것을 전처리했다. 필자는 분석에 필요한 코드를 정규화했다. 이제 코드를 한 줄씩 실행하고 실행을 계속하면서 데이터를 추출하려면 어떻게해야합니까? (이것이 불가능한 것인지 아니면 제 목표를 달성 할 수있는 프로그램을 제대로 수행 할 수있는 방법이 있는지 말해주십시오.) 나는 동적으로 할당 된 공간의 메모리 주소, 함수 호출의 반환 주소와 같은 정보를 수집하는 것을보고있다.

나는 이전에 CIL로 제안되었는데, CIL은 많은 변형을 처리하는 정규화 된 형식으로 코드를 변형하는 변형 도구이지만 내 문제와 관련된 정보는 얻을 수 없었다.

제 질문은 정보를 한 줄씩 어떻게 추출하고 어떤 언어를 사용하는 것이 좋습니까? 명령형 언어 또는 함수형 언어? 나는 이것에 관한 정보로 꽤 며칠 동안 인터넷 검색을 해왔지만 아무 쓸모가 없다. 모든 링크도 매우 높이 평가됩니다. 감사.

편집 : 아직 몇 가지 의구심이 있습니다. 가상 환경을 구축하기 위해 노력하고 있습니다. 제가 뭘하려고하는지 설명해 드리겠습니다. 토론에 도움이 될 것입니다. 나는 기본적으로 포인터 연산에 집중하는 포인터 분석을 기본적으로 시도하고있다. 이제 정수형 포인터가 있고 포인터 산술을 한 다음 포인터가 여전히 유효한 데이터를 가리키는 지 확신 할 수 없다고 가정합니다.

당신이 말하는 바에 따르면 변수에 공백을 할당해야하지만 그 값은 무엇인지 알 수 있습니다. 내가

int a=10;
int *p = &a;
p = p+4;

아래 여기의 값과 일정 같은이있는 경우 '4'알려져있다. 사용자 또는 파일로부터 가치를 얻을 수 있다면 어떨까요? 이 경우 실제 프로그램을 실행해야합니다. 동시에 주소와 같은 데이터를 캡처해야합니다. 아래

int *p =(int *) malloc (sizeof(int));
*p= 15;
cout<<*p;
p = p+ino//some user input value;
cout<<*p;

그래서 기본적으로 코드가 실행되지만 솔루션의 후반부가 더 C 파일을 구문 분석과 같은 소리를해야합니다. 내가 틀렸다면 나를 바로 잡아주세요. 당신을 가정

+1

"추상적 해석"이란 말은 프로그램에서 수행 할 수있는 모델을 모델링하려고하는 프로그램 분석 기술을 의미합니까? 아니면 컴퓨터 코드로 컴파일하지 않고 C 코드를 실행하는 방법입니까? 전자의 경우 어떤 분석을 수행하려고합니까? 후자의 경우에, 당신은 무엇을 당신을 위로 트리핑에 정성 들일 수 있습니까? – templatetypedef

답변

3

정말

추상 해석은 두 가지에 의존 ... 단순히 해석 C보다는 추상적 인 해석에 대해 얘기 - 추상 도메인, 유한 높이 격자와 추상적 인 의미를 그것에 의하여의 적용 의미 전에 선에서 도메인의 값에 대한 행은 동일한 높이 또는 그 이상인 도메인에 새 값을 생성해야합니다. 도메인이 {1,2,3,4}의 파워 셋이고 입력은 만 유효 출력 {1,2,3} 또는 {1,2,3,4}있다 {1,2,3} 경우

당신은 각 행에 고정 소수점 순환을 수행하고 저장함으로써 계속

(통상의 세트 순서를 가정 할 때), 즉 행과의 시맨틱 스 출력, 그리고 각 함수의 끝에있는 함수 정의를 가진 의미론을 포함한다.어떻게하면 도메인을 선택하고 당신이 끝낼 세트를 해석하는 것은 당신이하려고하는 분석에 엄청나게 의존하지만, 그것이 그것을 이해하는 개요입니다 ...

나는 이 아니라고 말합니다. 전문가 하지만 내 연구 동료 중 일부는 과거에 그것에 대해 이야기를 나눴습니다. 이것은 내가 가지고 나온 이해입니다 ...

또한 분석을 역방향으로 쉽게 실행할 수 있습니다. 함수의 끝과 앞으로 나아가면, 이것은 어떤 종류의 분석에 더 적합 할 것입니다 ...

+0

+1 이것은 추상적 인 해석에 대한 훌륭한 설명입니다. 이것이 OP가 언급했던 것이기를 바랍니다. – templatetypedef

+0

당신도 제 의심을 덜어 줬습니다.설명에서, 나는 추상적 인 해석보다는 오히려 코드를 해석하려고하고 있다고 생각한다. 문제 요구 사항과 이전 질문의 답변에서 나는 이것이 추상적 해석이라고 생각했다. – bsoundra

+1

사용할 격자가 유한 높이 일 필요는 없습니다 (첫 번째 예제 중 하나는 오버플로가없는 작은 프로그래밍 언어의 간격 범위 분석이며 정수 간격의 격자는 확실히 유한 높이가 아닙니다). 시맨틱 함수는 ** 단조로 ** (x f (x)

1

당신이 당신의 문제를 제기하는 방식에서, e에 대해 말하는 것은 해석이 아니라 추상 해석이 아닙니다. 해석은 C 코드를 취하여 런타임시에 발생하는 일들의 정보를 추출하기 위해 직접 실행하는 것을 의미합니다. 추상 해석은 정적 분석 절차를 말합니다.이 분석 절차에서는 프로그램이 수행 할 수있는 것을 이해하고 가능한 경우 최적화를 위해 또는 버그의 부재 또는 정확성을 증명하려고 시도 할 수 있습니다. 물론, 나는 이것에 대해 완전히 틀릴 수도 있습니다.이 경우에는이 대답을 무시할 수 있습니다.

인터프리터를 쓰려면 프로그램이 실행될 가상 실행 환경을 설정해야 할 것입니다. 즉, 프로그램의 메모리 역할을하는 거대한 바이트 배열을 설정하고 자신의 스택 포인터와 힙 할당자를 유지해야 할 가능성이 높습니다. 그런 다음 줄 단위로 이동하고 실행중인 특정 코드 줄을 기반으로이 환경의 상태를 수정하여 프로그램을 실행할 수 있습니다. a에 의해 참조되는 글로벌 메모리 어레이의 어떤 부분을 찾아 볼 것

a = 137; 

같은 것을 실행하는 동안 예를 들어, 4 바이트가 스택 포인터를 증가시켜 작동합니다

int a; 

같은 문을 실행 137에 대한 4 바이트 값으로 바이트를 덮어 씁니다. 이 시점에서 실행 중에 일어나는 일을 추적하는 것은 비교적 간단해야합니다. 인터프리터가 특정 명령문을 실행하거나 표현식을 평가하기 전에 관련 세부 정보를 기록 할 수 있습니다.

이것은 쉽지 않을 것이라는 점에 유의하십시오. 수동으로 스택 프레임을 할당하고 지우고, 프로그램 카운터 등을 유지해야 할 것입니다. 그러나, 그것은 많은 즐거움처럼 들리지만, 나는 여러분에게 그것과 함께 최선의 행운을 빕니다!

+0

은 서식 문제로 인해 질문에 대한 편집으로 응답했습니다. – bsoundra

2

CIL은 SSA-transform을 수행 할 수 있습니다. SSA 형식의 프로그램은 놀랍게도 reason about으로 쉽게 부분적으로 평가할 수 있습니다. 이름이 바뀌거나 피노드에서 오는 값이 합쳐진 것을 무시하면됩니다. 따라서 CIL을 적절한 추상적 인 인터프리터로 변환하려면 SSA (이미있는) 다음에 몇 가지 변형을 추가하면됩니다. 또는 Clang이 제작 한 LLVM IR 위에서도 이러한 종류의 변형을 수행 할 수 있습니다.