제목 : 정적 프로그램 분석 시리즈 (II)

静态程序分析(二)​

1 调用图:Call Graph Construction​

1.1 概念​

본질적으로, 통화 그래프는 호출 지점에서 대상 방법 (Callee)까지一系列调用边입니다.
202202190937291.png-water_print

프로그램 통화 다이어그램은 프로세스 간 분석의 기초이며 프로그램 최적화, 이해, 디버깅, 테스트 등에 사용할 수 있습니다.

1.2 分类​

통화 그래프 다양한 건축 방법이 있으며이 기사는 미래에 두 가지 극단을 설명 할 것입니다. 가장 정확하고 가장 빠릅니다.
202202190938687.png-water_print

전화 그래프 구성은 주로 객체 지향 언어, 즉 Java가 대표하는 객체 지향 언어로 작용합니다. 일반적으로, 4 개의 알고리즘은 그림과 같이 사용되며, 그중 Cha가 가장 빠르며 포인터 분석 K-CHA는 가장 정확합니다. 이 기사에는 주로 CHA가 포함되어 있으며 후속 기사는 포인터 분석에 대해 이야기합니다.

1.3 Java 中的方法调用形式​

202202190940655.png-water_print

명령어 : Java의IR 中的指令수신기 개체를 나타냅니다. 메소드 호출의 해당 인스턴스 개체 (정적 메소드 호출에는 해당 인스턴스가 필요하지 않음).
대상 방법 :IR 指令到被调用目标方法的映射关系을 나타냅니다. 대상 방법 : 호출 될 수있는 대상 방법의 수를 호출하십시오. 가상 호출은 동적 바인딩 및 다형성 구현과 관련이 있으며 여러 객체의 재 작성 방법에 해당 할 수 있습니다. 그래서Virtual call 的可能对象可能超过 1 个.
결정 :이 호출의 해당 메소드를 결정할 수있는시기를 나타냅니다. 가상 호출은 다형성과 관련이 있으며 런타임에 호출 할 특정 방법 만 결정할 수 있습니다. 다른 두 가지 유형의 통화는 다형성 메커니즘과 관련이 없으며 컴파일 시간을 결정할 수 있습니다.

1.4 Virtual Call的方法调度函数 (Dispatch)​

가상 호출은 여러 통화 중 가장 복잡하므로 우선 초점이됩니다. 동적으로 실행할 때 가상 호출은 두 가지 점을 기준으로 호출 할 특정 방법을 결정합니다.
가상 호출 컨텐츠의 수신 객체를 반환합니다 :c方法签名:m콜 포인트 서명=클래스 유형 + 메소드 이름 + 설명자
설명자=반환 유형 + 매개 변수 유형
이 기사의 메소드 서명 정의는 다음과 같습니다.
202202190945032.png-water_print

함수 간의 분포 관계를 설명하기 위해 디스패치 (c, m) 함수 정의 : Java의 디스패치 메커니즘은 어떤 메소드가 호출되는지, c는 클래스 이름이고, m은 메소드입니다. 이 클래스에서 이름 및 디스크립터와 일치하는 메소드를 찾을 수있는 경우 C의 메소드를 호출하십시오. 그렇지 않으면 부모 클래스에서 검색하십시오.
202202190949182.png-water_print

예를 들어 : Dispatch를 따르십시오. 수신기 개체, 즉 새 b () 및 메소드 서명 : a.foo ()
202202190951406.png-water_print

2 Class Hierarchy Analysis (CHA)​

2.1 定义​

먼저 전체 프로그램의 클래스 상속 관계 다이어그램을 얻어야합니다.
변수의 선언 유형을 수신하여 가상 호출을 구문 분석
변수 수신 예 : a.foo ()에서 A는 변수를 받고 있습니다.
수신 변수가 A 또는 A의 모든 서브 클래스를 가리킬 수 있다고 가정합니다.

2.2 具体过程​

다음은 통화를위한 알고리즘을 설명합니다. Reslove (CS) 함수는 다음과 같이 정의됩니다. CHA 알고리즘을 통해 프로그램 호출 지점에 해당하는 가능한 목적 함수 엔티티를 찾으려면.
202202191001784.png-water_print

통화 사이트 (CS)는 Call 문이고 M (메소드)은 해당 함수 서명입니다.
t 컬렉션에서 찾은 결과를 저장하십시오
3 개의 IF 분기는 앞에서 언급 한 Java의 세 가지 통화 유형에 해당합니다.
정적 호출
특별 전화
가상 호출

2.2.1 static call​

클래스 이름은 정적 메소드가 호출되기 전에 작성되었으며 정적 메소드가 호출되기 전에 변수 또는 포인터 이름이 작성됩니다. 정적 메소드 호출에는 종속성 인스턴스가 필요하지 않습니다. 따라서 정적 메소드 호출의 분석 결과는 매우 간단합니다. 현재 클래스의 방법이 호출되므로 세트 T에 직접 추가됩니다.
202202191006532.png-water_print

2.2.2 special call​

202202191013525.png-water_print

특별 전화는 주로 세 가지 상황으로 나뉩니다. 위 그림은 슈퍼 클래스를 사용하는 첫 번째 호출 방법입니다. foo ()는 현재 클래스에서 정의되지만 실제로 부모 클래스의 foo ()를 사용하므로 디스패치 함수를 사용해야합니다. foo ()의 서명 m은 컴파일러에 의해 반환되며 B로 알려질 수 있습니다. 그런 다음, foo ()의 반환 값을 얻는 C는 또한 부모 클래스를 보는 것과 동등한 b를 가리 킵니다.
슈퍼 콜을 처리하기 위해 디스패치 기능을 사용해야하는 이유는 무엇입니까? Class C의 Super.foo Call은 아래 그림에 표시된 경우 디스패치 함수 없이는 올바르게 구문 분석 할 수 없습니다.
202202191016937.png-water_print

개인 인스턴스 방법과 생성자 (클래스에서 구현해야하거나 기본 생성자가 있어야 함)는 모두이 클래스의 구현에 제공됩니다. 디스패치 함수를 사용하면 세 가지 상황이 모두 포함되어있어 코드를 단순화 할 수 있습니다.

2.2.3 virtual call​

202202191020986.png-water_print

마지막으로 Cha와 다른 알고리즘의 주요 차이점 인 가상 호출을 처리하는 것입니다. 알고리즘은이 방법에 대한 디스패치 (c, m)를 수행하고 C의 모든 서브 세트와 서브 세트의 서브 세트에 대해 디스패치 (c ', m)를 한 번에 수행합니다. 직관적으로, 그것은 두 단계로 나눌 수 있습니다. 첫 번째 단계는 직접 파견하고 현재 클래스에 foo ()가 있는지 확인하는 것입니다. 그렇지 않다면, 부모 수업에서 그것을 재귀 적으로 검색하십시오. 두 번째 단계는 현재 클래스의 모든 서브 세트에서 모든 foo ()를 찾은 다음 첫 번째 단계에서 찾은 모든 푸스를 T에 추가하는 것입니다.
An example:
202202191024074.png-water_print

일반적으로 IDE에 사용되며 사용자에게 프롬프트를 제공합니다. 예를 들어, 작은 테스트 코드를 작성하여 어떤 함수 서명 B.foo ()가 호출 할 수 있는지 확인하십시오. CHA 분석에서 b.foo ()가 a, c 및 d에서 foo () 메소드를 호출 할 수 있음을 알 수 있습니다.
202202191031116.png-water_print

2.3 CHA 的特征​

클래스 상속 구조 만 고려되므로很快데이터 흐름 및 제어 흐름의 정보가 무시되기 때문에不太准确

2.4 调用图构建​

은 세 단계로 나뉩니다.
입구 방법에서 입력하는 것은 일반적으로 주요 방법입니다.
액세스 가능한 각 방법 M에 대해 CHA 알고리즘은 포인트 호출 메소드 M '의 호출 위치를 찾는 데 사용됩니다.
각 M (및 새로 추가 된 M ')에 대해 두 번째 단계를 수행하여 새로운 방법이 발견되지 않았다는 것을 알고
통화 그래프 구성을위한 알고리즘은 다음과 같습니다.
202202191036378.png-water_print

워크리스트는 처리 해야하는 방법을 기록합니다
통화 그래프는 제작 해야하는 목표이며, 통화 가장자리 모음입니다.
도달 가능한 방법 (RM)은 처리 된 대상입니다. 워크리스트에서 새 대상을 가져 오면 이미 RM에있는 대상을 처리 할 필요가 없습니다.
An example:
202202191043156.png-water_print

3 过程间的控制流图:Interprocedural Control-Flow Graph​

ICFG=CFGS +call return edges통화 가장자리 : 호출 포인트 통화 사이트에서 호출 된 메소드 Callee의 입구까지
반환 엣지 : Callee Return 문에서 통화 사이트下一句
202202191053181.png-water_print

다이어그램은 프로세스 간의 제어 흐름도입니다. ICFG는 본질적으로 CFG이며 3 개의 주소 코드로 구성된 기본 블록으로 구성되어야합니다. 그러나 명확한 분석을 위해 BB는 여전히 분리되어 분석됩니다.

4 过程间数据流分析:Interprocedural Data-Flow Analysis​

4.1 定义与比较​

프로세스 간 분석을위한 Edge 및 해당 전송 기능을 추가로 호출합니다.
202202191100147.png-water_print

통화 엣지 전송 : 발신자에서 Callee로 매개 변수를 전달합니다.
반품 전송 : Callee는 반환 값을 발신자에게 전달합니다.
노드 전송 : 기본적으로 이전 기사에 언급 된 전송 함수와 동일하지만 추가 속성이 있습니다. 각 호출 (예 : b=foo (a))의 경우, 방정식의 왼쪽 값이 죽은 다음 다음 단계에서 리턴 에지 전송 함수가 재 할당됩니다. 이 작업은 반환 값이 원래 값과 다를 때 데이터 충돌을 방지 할 수 있습니다.

4.2 示例​

202202191059364.png-water_print

이 단락의 필요성?
202202191113887.png-water_print

이 섹션을 사용할 수없는 경우 변수 A는 호출 된 함수 분석 전반에 걸쳐 A의 값을 기억해야하므로 프로그램이 실행될 때 많은 메모리가 낭비됩니다.
또한 통화 문에서 표현식의 왼쪽에 값을 죽이는 것을 잊지 마십시오. 그렇지 않으면 결과가 정확하지 않습니다.
202202191114828.png-water_print
 
뒤로
상단