`에 대해서 `true,` `false`를 테스트하라는 것과 동일한 얘기가 아니다.***

### 3) Note on Predicates

### 4) Short Circuit Evaluation

<img src="../images/security-engineering-7-implementation-assurance-6.4.1.1.png?raw=true" alt="drawing" width="640"/>

<br/>

### 5) Logic Coverage Criteria

Apply `logic coverage criteria` to derive `test requirements` and design `test cases`.

- Active Clause Coverage (ACC): 실제 `predicate`의 `true` 또는 `false`를 결정하는데 영향을 미치는 중요한 `clause`
- General Active Clause Coverage (GACC)
- Correlated Active Clause Coverage (CACC)
- Restricted Active Clause Coverage (RACC)

<br/>

### 6) Logic Coverage Criteria Subsumption

<br/>

### 7) Logic Expressions from Source Code

Applying logic criteria to program source is hard because of `reachability` and `controllability`.

소프트웨어 `소스코드`에 있는 `로직`을 `모델링`하여 테스트 케이스를 도출하는 것은 쉽지 않다. 왜냐하면 각 조건을 설정하여 `predicate`들이 true일 때와 false일 때를 따져보고, 거기에 맞기 각 `clause`들이 true인지 false인지까지 테이블을 작성하는 것은 가능하지만, 그 이후에 실제로 각 `clause`들이 true 또는 false가 되게 하는 ***실제 input values를 어떻게 넣을지를 모두 도출하는 것이 쉽지 않다.***

- `Reachability` : must get to the predicate statement that we are applying the criteria on
- `Controllability` : must find input values that indirectly assign values to the variables in the predicates
- `Internal variables` : variables in the predicates that are not inputs to the program. input이 아니라 프로그램 내부에서 선언되는 변수들이 있음

<br/>

### 8) Logic Expressions from Specifications

Logic coverage criteria 역시 스펙 문서에서 도출할 수 있다. 하지만 정밀도가 낮다.

<br/>

### 9) Logic Expressions from FSMs

<br/>

## 7. Syntax Coverage

### [Note] Syntax Based Testing

<img src="../images/security-engineering-7-implementation-assurance-7.0.1.1.png?raw=true" alt="drawing" width="640"/>

<br/>

### 1) Four Structures for Modeling S/W

<img src="../images/security-engineering-7-implementation-assurance-7.1.1.1.png?raw=true" alt="drawing" width="240"/>

<br/>

<img src="../images/security-engineering-7-implementation-assurance-7.1.1.2.png?raw=true" alt="drawing" width="640"/>

<br/>

소프트웨어를 모델링하고 `문법`을 이용하여 test case를 도출하는 방법이다. 

`fuzzing`은 `Syntax` 기법 중에서 `Inputs`에 해당한다(`Input space`). `fuzzing`을 할때 `입력값`을 무작정 랜덤하게 주는 것이 아니라 특정 `문법`에 맞춰서 주게 된다.

사실 `Syntax` 기법에서 가장 중요한 것은 `Source`를 이용하는 것이다(`program-based`).

<br/>

### 2) Using the Syntax to Generate Tests

<br/>

### 3) Syntax Based Testing

<br/>

### 4) Grammar : Regular Expression

<img src="../images/security-engineering-7-implementation-assurance-7.4.1.1.png?raw=true" alt="drawing" width="520"/>

<br/>

### 5) Test Cases from Grammar

<br/>

### 6) Backus-Naur-Form (BNF) Grammars

<img src="../images/security-engineering-7-implementation-assurance-7.6.1.1.png?raw=true" alt="drawing" width="520"/>

<br/>

### 7) Using Grammars

<img src="../images/security-engineering-7-implementation-assurance-7.7.1.1.png?raw=true" alt="drawing" width="520"/>

<br/>

#### Example : Valid and Invalid Mutants

<img src="../images/security-engineering-7-implementation-assurance-7.7.2.1.png?raw=true" alt="drawing" width="520"/>

<br/>

- `Ground String`: 기본적으로 주어지는 초기 seed 값
- `Mutant`: `Ground String`을 변형한 것(변종)
- `Valid Mutants`: 문법에 맞는 유효한 mutants
- `Invalid Mutants`: 문법에 맞지 않는 유효하지 않은 mutants

<br/>

### 8) UnMutated Derivation Test Coverage

<br/>

### 9) Mutated Derivation Test

<br/>

### 10) What is Mutation Testing?

<br/>

### 11) Underlying Concept : Mutation Testing

`Program-based`

<br/>

<img src="../images/security-engineering-7-implementation-assurance-7.11.1.1.png?raw=true" alt="drawing" width="640"/>

<br/>

#### Mutation Testing (9.2.2)

<img src="../images/security-engineering-7-implementation-assurance-7.11.2.1.png?raw=true" alt="drawing" width="640"/>

<br/>

위 소스코드의 조건문에서 `i >= 0` → `i > 0`로 `mutant`를 생성한다.

<br/>

##### Ineffective

Input: x = {1, 3, 2};
Output original : -1
Output mutant : -1

<br/>

##### Killed

Input: x = {0, 1, 2};
Output original : 0
Output mutant : -1

<br/>

`subject`는 ground string에 해당한다.

`Mutation Testing`은 `test case`가 잘 만들어졌는지를 테스트하는 것이다. 따라서 `killing mutant`가 많을 수록 좋은 test case가 도출된 것이다. 얼마나 많은 `mutant`를 죽이는지가 `coverage`이다.

e.g. 어떤 컴파일러가 있을 때, �