목차
1. Mathworks 계정 생성 및 라이선스 설정
2. Polyspace 초기 화면 및 Code Prover 기본
3. 최대값 출력 프로그램 작성
- 메모리 동적 할당
4. 프로그램 Code Prover 분석
1) Non-initialized local variable
2) Illegally dereferenced pointer
3) Non-initialized variable
1. Mathworks 계정 생성 및 라이선스 설정
Mathworks 라이선스 설정
우측 상단 아이콘 - 내 계정 > 내 소프트웨어
다운로드 아이콘 클릭하여 R2023a 릴리스 버전 다운로드(계정 내 라이선스 필요)
R2023a 버전 installer 실행
대상 폴더: /Applications/Polyspace/R2023a
제품 선택: Polyspace Bug Finder + Polyspace Code Prover
필요 용량: 3.72 GB 정도
2. Polyspace 초기 화면 및 Code Prover 기본
terminal 연결하여, Polyspace 설정 경로로 이동 후, 실행
cd /Applications/Polyspace/R2023a/polyspace/bin
./polyspace &
실행 완료되면 하단 Polyspace R2023a 연결
Run-time Check 중
Red Check: 특정 에러가 100%로 발생하는 경우
Gray Check: Dead code, Unreachable code
Orange Check: 특정 에러에 대해 증명할 수 없는 경우
Green Check: 런타임 에러가 발생하지 않는 경우(정상)
Purple Category: Coding rules
3. 최대값 출력 프로그램 작성
arr 배열에 대한 초기값을 넣어주지 않아 에러 발생
// 초기 코드
#include <stdio.h>
int main(int argc, const char * argv[]) {
int n, arr[n];
printf("Enter full array size\n");
scanf("%d", &n);
printf("Enter values to store in the array\n");
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
int max = arr[0];
for (int j = 1; j < n; j++) {
if (max < arr[j])
max = arr[j];
}
printf("The maximum value of an array element is %d\n", max);
return 0;
}
arr 배열을 만들기만 하고 값을 넣어주지 않음 – 선언(Declare)의 상태
선언한 변수에 처음 값을 넣어 줌 – 초기화(Initialize)
초기화한 이후 변수에 값을 넣어 줌 – 할당(Allocaiton)
→ arr 배열 동적 할당 필요
메모리 동적 할당
컴퓨터 프로그램이 실행되는 런타임 도중 사용할 메모리 공간을 할당
동적 할당되는 메모리는 힙 영역에 생성
sizeof(int) 4byte 할당 * n
이후 동적 할당 메모리 해제(free)
// sol1
#include <stdlib.h> // malloc, free 함수가 포함된 헤더 파일
#include <strings.h> // memset 함수가 포함된 헤더 파일
int* arr = (int *)malloc(sizeof(int) * arr_size);
memset(arr, 0, sizeof(int) * arr_size);
free(arr);
malloc 할당 이후 memset 초기화하는 과정은 calloc 함수 하나로 대체 가능
// sol2
#include <stdlib.h> // calloc 함수가 포함된 헤더 파일
int* arr = (int *)calloc(0, sizeof(int) * arr_size);
// 1차 수정
//
// main.c
// week.04_SecureCoding
//
// Created by sehee on 2023/03/27.
//
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
int max(int* ptr, int n);
int main(int argc, const char * argv[]) {
// 최대값을 출력하는 프로그램, 배열은 동적 할당 받기
int arr_size;
// 첫번째 입력: 전체 배열 크기
printf("Enter full array size\n");
scanf("%d", &arr_size);
int* arr = (int *)malloc(sizeof(int) * arr_size);
// memset(arr, 0, sizeof(int) * arr_size);
// error
if (arr == NULL) {
printf("malloc error");
exit(1);
}
// 두번째 입력: 배열 내 저장할 함수 - 각 index에 해당 값 할당
printf("Enter values to store in the array\n");
for (int i = 0; i < arr_size; i++) {
scanf("%d", &arr[i]);
}
// 출력: 최대값
printf("The maximum value of an array element is %d\n", max(arr, arr_size));
free(arr);
return 0;
}
int max(int* ptr, int n) {
int max_val = ptr[0];
for (int i = 1; i < n; i++) {
if (max_val < ptr[i]) {
max_val = ptr[i];
}
}
return max_val;
}
4. 프로그램 Code Prover 분석
1) Non-initialized local variable
초기 변수(arr_size) 선언 후 초기화
int arr_size = 0;
2) Illegally dereferenced pointer
3) Non-initialized variable
max 함수의 ptr에 대해 초기화하지 않음(의미X) - 변경X
// type1
int max(int* ptr, int n);
// type2
int max(int n[], int size);
// 최종 코드
//
// main.c
// week.04_SecureCoding
//
// Created by sehee on 2023/03/27.
//
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
int max(int n[], int size);
int main(int argc, const char * argv[]) {
// 최대값을 출력하는 프로그램, 배열은 동적 할당 받기
int arr_size = 0;
// 첫번째 입력: 전체 배열 크기
printf("Enter full array size\n");
scanf("%d", &arr_size);
int* arr = (int *)malloc(sizeof(int) * arr_size);
// memset(arr, 0, sizeof(int) * arr_size);
// error
if (arr == NULL) {
printf("malloc error");
exit(1);
}
// 두번째 입력: 배열 내 저장할 함수 - 각 index에 해당 값 할당
printf("Enter values to store in the array\n");
for (int i = 0; i < arr_size; i++) {
scanf("%d", &arr[i]);
}
// 출력: 최대값
printf("The maximum value of an array element is %d\n", max(arr, arr_size));
free(arr);
return 0;
}
int max(int n[], int size) {
int max_val = n[0];
for (int i = 1; i < size; i++) {
if (max_val < n[i]) {
max_val = n[i];
}
}
return max_val;
}
'Security & Analysis > Polyspace' 카테고리의 다른 글
[C programming] 자료형 및 오버플로우 대처 방안 (0) | 2023.03.16 |
---|