나는 오래전부터 궁금했다. 학교에서 과제로 하는 SW(코딩)과 회사에서 쓰는 코딩은 어떤 차이가 있을까?
일단 회사에서 만드는 SW는 돈 받고 파는 제품이니까 안전한 SW를 만들어야 될 거 같은데..
특히 자동차는 사람 생명과 연관되어있으니 더욱 더 안전하게 만들어야 할 것 같은데 SW를 안전하게 만든다는게 어떤 개념인지 전혀 감이 안 왔다.
아직도 모르는 것 투성이지만..
일단 회사에서 만드는 SW는 학교에서 과제로 하던 SW와 다른점이.. 평가/검증 조직이 따로 있다는 점. 그리고 평가/검증을 받는다는 점이다.
다양한 평가/검증 방법, 프로세스, 툴, 기법이 있다. 컴퓨터공학과를 전공했지만 ‘SW 테스팅’ 이라는 개념 자체를 아예 몰랐다. (지금도 사실 잘 모른다.)
심지어 국제 SW 테스팅 자격증. 그런게 있는지도 몰랐다.
====================================================================
아무튼 오늘은, SW 테스트 종류 중에서 가장 기본적인 ‘정적검증’ 에 대해서 주절거리려고 한다.
정적검증과 대비되는 개념은 동적검증이다.
이 2개의 차이를 아주 간략하게 말하면
동적검증은 타겟에 실제로 SW를 다운로드해서 실행시키면서 테스트 하는 것이고,
정적검증은 그냥 소스코드만 가지고 정적검증 툴이 분석해서 취약점을 찾는 것이 정적검증이다.
우리가 c코드를 만들고 build 한 결과물을 컴퓨터에서 실행시켜놓고.., printf를 찍어가면서.. 혹은 break point 걸어두고 디버깅 하는 것..
그런식으로 실제로 sw를 실행시키면서 검증하는 것은 동적검증이고,
sw를 코딩한 후, 컴파일러로 build 하면 소스코드를 분석해서 컴파일 에러가 발생한다.
혹은 warning을 띄어준다던지. 이런게 정적검증이다.
실제로 코드를 돌려서 검사하는게 아니라 단지 소스코드 그 자체를 검사해서
뭔가 잘못된 부분이 있으니 고쳐라! 하고 검사하는게 정적검증이다.
정적검증을 하는 방법은 정적검증 툴에다가 검증받으려는 SW를 넣고 실행시키면 끝이다.
자동차업계에서 사용하는 대표적인 정적검증 툴로는
PolySpace(폴리스페이스), QAC (큐에이씨) , CodeSonar(코드소나) 등이 있다.
이러한 툴에다가 우리가 검증하고 싶은 소스코드를 설정한다음
‘분석실행’ 이런 버튼 하나만 누르면
컴파일러가 컴파일 하듯이 툴이 알아서 코드를 분석해서 결과를 보여준다.
현재 코드를 그대로 사용하면 어떤 문제점이 발생할 수 있으니 고치세요! 하고 알려준다.
이 때 대표적인 취약점 몇 가지를 소개하면...
1)지역 변수를 초기값 없이 선언할 때
int fun(void)
{
int a;
}
지역변수 a를 초기값 없이 선언하면 쓰레기값이 들어가게 된다.
쓰레기 값은 어떤 값이 들어갈지 모르기 때문에 그대로 사용하면
예상치 못한 위험이 있을 수 있다.
검증툴이 우리 소스코드를 훑어보다가 저런식으로 지역변수를 초기값 없이 선언만 해놓은 부분이 있으면 저부분을 가르키면서 여기 취약하니까 고쳐라! 하고 알려준다.
2) OverFlow 발생
ex)
int input1=5;
int input2=10;
char result= input1 + input2 ;
8비트 변수인 result에 32비트 변수의 결과값을 넣고 있다. 위 코드에서는
더하기 값이 15이기 때문에 result에 넣어도 문제가 없겠지만...
어쨌든 32비트 변수를 8비트에 넣는 것은 무언가 문제가 있을 수 있다.
3) 배열 인덱스 범위 초과
ex)
int arr[10];
arr[11]=5;
배열 arr은 arr[0] ~ arr[9] 까지 사용해야되는데
arr[11] 에 접근하고 있다. 이것은 위험하다!
4) 상수의 값 변경
ex)
const int a=5;
a=3;
변수 a는 const 명령에 의하여 상수화되었다.
그런데 a=3으로 값을 변경하려하였다. 이는 잘못됐다
.. 대표적이고 이해하기 쉬운 예시를 위와 같이 들어봤다.
이 외에도 사람이 코드를 짜면서 전혀 생각지 못했지만, 문제가 될 여지가 있는
온갖 가능성을 분석해서 전부 알려준다.
우리는 툴이 알려주는 그 결과를 보고 그런 에러가 없어지도록 수정을 하면된다.
========================================================================
그리고 정적검증을 얘기하면서 MISRA-C (미즈라 씨)를 얘기 안 할 수가 없다.
'자동차 임베디드 SW > 툴 관련' 카테고리의 다른 글
Binary 파일 읽기 (Notepad++ plugin) (0) | 2022.08.02 |
---|---|
Tera Term 키보드 입력이 안될 때 (2) | 2021.12.15 |
배치파일 관련 (0) | 2021.03.12 |
VSCODE 유용한것 메모 (0) | 2021.02.19 |
정적검증과 미즈라씨 Misra-C (3) | 2019.07.06 |