목차11개 항목
출처와 참고
고려사이버대학교 「소프트웨어공학」(2024-1학기) 강의 내용을 바탕으로 정리했다.
안전은 위험이 0인 상태가 아니다. 허용할 수 없는 위험이 없는 상태, 바꿔 말해 허용 가능한 위험만 남은 상태다. 위험은 위험원(hazard, 해를 끼칠 수 있는 잠재 원인)이 실제 피해로 이어질 발생 가능성과 심각도의 조합으로 판단한다. 소프트웨어 안전은 소프트웨어가 그런 허용 불가 위험의 원인이 되지 않게 하는 것이다.
왜 소프트웨어 안전인가
항공기 기능에서 소프트웨어가 차지하는 비중은 1960년대 F-4의 약 8%에서 2000년대 F-35의 약 90%로 늘었다. 자동차의 구동·조향·제동, 방사선 치료기, 철도 신호처럼 사람의 생명이 걸린 기능이 기계에서 소프트웨어로 넘어가고 있다. 이런 시스템을 안전 필수 시스템(Safety-critical System) 이라 한다.
| 사례 | 무슨 일이 있었나 |
|---|---|
| Therac-25 (1985~1987) | 방사선 치료기가 경쟁 조건 버그로 환자에게 과다 방사선을 조사했다. 이전 모델에 있던 하드웨어 안전장치를 소프트웨어 검사로 대체한 것이 화근이었다 |
| Ariane 5 (1996) | 첫 발사 37초 만에 폭발했다. 64비트 실수를 16비트 정수로 바꾸다 넘침이 났고, 예비 컴퓨터도 똑같은 소프트웨어라 똑같이 멈췄다 |
| Boeing 737 MAX (2018~2019) | 자세 보정 시스템(MCAS)이 받음각 센서 하나의 잘못된 값에 의존해 기수를 반복해서 내렸고, 두 번의 추락으로 이어졌다 |
| Uber 자율주행 시험차 (2018) | 보행자를 인식하고도 분류를 계속 바꾸다 제때 제동하지 못했다 |
결함은 소프트웨어 → 컴포넌트 → 시스템 → 차량·항공기로 전파되며 고장, 위험원, 사고로 커진다. 용어는 에러·결함·고장에 있다.
안전을 확보하는 네 가지 전략
| 전략 | 목적 | 예 |
|---|---|---|
| 결함 예방 | 사람이 실수하지 않게 막는다 | 코딩 표준(MISRA C 등), 강한 타입 언어 |
| 결함 검출 | 들어간 결함을 찾는다 | 정적 분석, 동적 테스트, 코드 리뷰 |
| 결함 제거 | 찾은 결함을 없앤다 | 디버깅 |
| 결함 허용 | 실행 중 결함이 있어도 고장으로 번지지 않게 한다 | 중복 설계, 다양성 설계 |
앞의 셋은 결함을 줄이는 쪽이고, 마지막은 결함이 남아 있다고 가정하는 쪽이다. 안전 필수 시스템은 넷 다 쓴다.
중복성과 다양성
| 구분 | 중복성 (Redundancy) | 다양성 (Diversity) |
|---|---|---|
| 방법 | 같은 기능을 같은 방식으로 여러 벌 둔다 | 같은 기능을 다른 방식으로 여러 벌 둔다 |
| 하드웨어 예 | 같은 CPU 두 개 | 고장률이 다른 CPU 두 개 |
| 소프트웨어 예 | 같은 알고리즘을 여러 번 실행해 비교 | 다른 알고리즘·언어·팀이 만든 구현의 결과를 비교 |
| 막는 것 | 우연한 하드웨어 고장 | 설계 결함처럼 모든 복제본에 똑같이 있는 결함 |
Ariane 5는 중복성은 있었지만 다양성이 없었다. 소프트웨어 결함은 복제본 모두에 똑같이 들어 있으니, 같은 코드를 두 벌 돌려서는 막을 수 없다. 서로 다른 팀이 같은 명세로 따로 구현하고 결과를 투표로 고르는 방식을 N-버전 프로그래밍이라 한다. 서버 쪽 이중화 패턴은 고가용성과 이중화에 있다.
안전 표준
일반 개발 프로세스에 안전을 위해 반드시 해야 할 활동과 기법을 더한 것이 안전 표준이다. 전기·전자·프로그래머블 시스템의 기능 안전 표준 IEC 61508이 뿌리(메타 표준)이고, 분야별 표준이 여기서 갈라져 나왔다.
| 분야 | 표준 |
|---|---|
| 자동차 | ISO 26262 |
| 항공 | DO-178C, ARP 4754 |
| 철도 | IEC 62278, IEC 62279 |
| 의료 기기 | IEC 60601, IEC 62304 |
| 원자력 | IEC 60880, IEC 61513 |
| 기계 | IEC 62061 |
| 개인 지원 로봇 | ISO 13482 |
무결성 등급에 따라 기법이 세진다
IEC 61508은 요구되는 안전 수준을 SIL(Safety Integrity Level) 1~4로 나누고, 등급이 높을수록 더 많은 기법을 "권장"에서 "강력 권장"으로 올린다. 자동차는 ASIL AD, 항공은 DAL AE로 비슷한 등급을 쓴다.
| 기법 | 낮은 등급 | 높은 등급 |
|---|---|---|
| 정적 분석, 제어·데이터 흐름 분석 | 권장 | 강력 권장 |
| 정형 인스펙션 | 권장 | 강력 권장 |
| 경계값 분석 기반 테스트 | 권장 | 강력 권장 |
| 문장 커버리지 100% | 권장 | 강력 권장 |
| 분기 커버리지 100% | 권장 | 강력 권장 (SIL 3부터) |
| MC/DC 커버리지 100% | 권장 | 강력 권장 (SIL 4) |
커버리지 기준의 차이는 화이트박스 테스트에 예제로 정리했다. 결함 주입 테스트도 쓰인다. 정상 코드에 일부러 비정상 조건(연산자 바꾸기, 센서 값 끊기)을 넣어, 시스템이 예외 상황에서 안전하게 반응하는지 본다.
안전 개발 생명주기
V-모델의 각 단계 옆에 안전 활동이 나란히 붙는다. 요구사항 단계에는 안전 요구사항과 안전 분석, 설계에는 안전 아키텍처·상세 설계, 구현에는 안전 코딩 규칙, 테스트 단계마다 안전 테스트가 짝을 이룬다.
안전 분석 기법
안전 분석은 사고를 일으킬 수 있는 상태나 조건을 찾고 그 원인을 따지는 일이다. 예로 스마트 전기 포트(물을 끓이고 보온하는 제어 소프트웨어가 들어 있다)를 쓴다.
FMEA: 부품 하나가 고장 나면?
FMEA(Failure Mode and Effect Analysis) 는 아래에서 위로 간다. 구성 요소마다 고장 모드를 나열하고, 그 영향과 원인, 대책을 표로 정리한다. 심각도·발생도·검출도를 곱한 위험 우선순위(RPN)로 순서를 매기는 경우가 많다.
| 구성 요소 | 고장 모드 | 영향 | 원인 | 대책 |
|---|---|---|---|---|
| 온도 센서 | 실제보다 낮은 값 출력 | 가열이 멈추지 않아 과열 | 센서 노화, 접촉 불량 | 값 변화율 이상 감지, 독립 온도 퓨즈 |
| 가열 제어 SW | 끄기 명령 누락 | 과열 | 상태 전이 로직 오류 | 상태 머신 리뷰, 워치독 타이머 |
| 수위 감지 | 물 없음을 감지 못함 | 빈 포트 가열 | 입력 값 범위 검사 없음 | 입력 범위 검사 모듈 추가 |
FTA: 이 사고는 어떻게 일어나나?
FTA(Fault Tree Analysis) 는 위에서 아래로 간다. 피하고 싶은 사고를 꼭대기에 두고, 그것을 일으키는 원인을 AND·OR 게이트로 분해한다.
flowchart TD
top["포트 과열 화재"] --- g1{"AND"}
g1 --- e1["가열이 멈추지 않음"]
g1 --- e2["온도 퓨즈 미작동"]
e1 --- g2{"OR"}
g2 --- e3["센서가 낮은 값"]
g2 --- e4["제어 SW 끄기 누락"]
e4 --- g3{"OR"}
g3 --- e5["입력값 오류"]
g3 --- e6["로직 오류"]AND 게이트 위에 있는 사고는 아래 원인이 모두 일어나야 생긴다. 독립된 온도 퓨즈를 하나 두는 것만으로 소프트웨어 결함이 곧바로 화재로 이어지는 길이 끊긴다. 결함 허용 설계의 효과가 트리에서 바로 보인다.
HAZOP: 이 값이 기준에서 벗어나면?
HAZOP(Hazard and Operability Study) 은 설계의 각 요소와 변수에 안내어(guideword) 를 대입해 이탈 상황을 체계적으로 상상한다. 형식은 "만약 [대상].[변수]가 [안내어]라면? → [이탈]"이다.
| 대상.변수 | 안내어 | 이탈 | 대응 |
|---|---|---|---|
| 온도 센서.값 | 없음 | 값이 오지 않음 | 일정 시간 무응답이면 가열 중단 |
| 온도 센서.값 | 더 높음 | 실제보다 높게 읽힘 | 덜 끓음. 사용성 문제로 분류 |
| 가열 명령.시점 | 늦게 | 끄기 명령이 늦게 도착 | 명령 처리 주기의 상한 설정 |
| 수위.값 | 반대 | 비었는데 가득 찼다고 읽힘 | 수위와 온도 상승률 교차 검증 |
FMEA는 부품에서 결과로, FTA는 사고에서 원인으로, HAZOP은 변수의 이탈에서 출발한다. 서로 빈틈을 메우므로 함께 쓴다.
정리
- 안전은 위험 0이 아니라 허용 불가 위험이 없는 상태다.
- 결함 예방·검출·제거로 결함을 줄이고, 결함 허용으로 남은 결함이 사고가 되지 않게 막는다.
- 소프트웨어 결함은 복제본에 똑같이 있으므로 중복성만으로는 부족하고 다양성이 필요하다.
- 안전 표준은 무결성 등급이 높을수록 정적 분석, 정형 인스펙션, MC/DC 같은 강한 기법을 요구한다.
- FMEA(상향), FTA(하향), HAZOP(이탈)으로 위험원을 찾고 원인을 끊는다.