Toyota 비의도 가속과 거대한 '스파게티' 코드 그릇 (2013)

발행: (2025년 12월 8일 오전 09:31 GMT+9)
12 min read

Source: Hacker News

2013년 11월 7일

배경

지난 달, 토요타는 오클라호마 배심원이 자동차 제조사가 “무모한 무시”를 했다고 판단하고 원고에게 300만 달러 판결을 내린 지 몇 시간 만에 의도치 않은 가속(UA) 소송을 합의했습니다. 배심원은 아직 징벌적 손해배상에 대해 판결을 내리지 않았습니다.

이 사건은 2007년 9월에 발생한 UA 사건에서 비롯되었습니다. 2005년식 토요타 캠리 차량이었으며, 진 북아웃과 동승자 바바라 슈바르츠가 오클라호마 주 고속도로 69를 빠져나가던 중 스로틀이 제어 불가능해졌습니다. 서비스 브레이크가 차량을 멈추지 못했으며, 북아웃은 주차 브레이크를 잡아 오른쪽 뒤 타이어에서 150피트, 왼쪽에서 25피트의 미끄럼 자국을 남겼습니다. 캠리는 경사로를 따라 계속 달려 제방에 충돌했고, 슈바르츠는 사망했습니다. 북아웃은 머리와 등 부상을 입고 5개월간 회복한 뒤 살아남았습니다.

베이즐리 앨런 소속 변호사 그레이엄 에스데일은 검은색 미끄럼 자국이 평결의 핵심 요소였다고 언급했습니다:

“토요타는 그 자국들을 설명할 수 없었습니다. 미끄럼 자국은 그녀가 브레이크를 잡았다는 것을 보여줍니다.”

재판 및 배심원 반응

배심원은 증언의 기술적 성격에도 불구하고 계속 참여했습니다. 합의 소식을 들은 뒤, 배심원들은 판사 패트리샤 패리시에게 재판에 대해 논의하기 위해 남아 있을 수 있는지 물었습니다. 열 명 정도의 배심원, 판사, 그리고 원고 측 변호인들이 모였고, 에스데일은 이 대화가 배심원들이 토요타의 행위와 은폐 의혹에 대해 처벌할 준비가 되어 있음을 명확히 보여주었다고 관찰했습니다.

전문가 증언

두 명의 소프트웨어 전문가—필립 쿱먼과 마이클 바—가 토요타의 소프트웨어 개발 프로세스와 소스 코드를 상세히 분석했습니다. 그들의 발견은 비트 플립, 태스크 종료에 따른 안전장치 비활성화, 메모리 손상, 단일 지점 실패, 스택 및 버퍼 오버플로에 대한 보호 미비, 수천 개의 전역 변수 사용 등 수많은 결함을 강조했습니다.

마이클 바

임베디드 소프트웨어 전문가인 바는 안전하게 보호된 환경에서 토요타의 소스 코드를 20개월 넘게 검토했습니다. 그는 800페이지에 달하는 보고서를 작성하고 구체적인 코드 문제에 대해 증언했습니다. 그의 증언 중 핵심 발언:

“과도하게 복잡한 함수가 많이 있습니다. 표준 산업 메트릭에 따르면 이들 중 일부는 테스트가 불가능합니다. 즉, 가능한 모든 상황을 테스트할 신뢰할 수 있는 테스트 스위트나 방법론을 개발할 방법이 없을 정도로 복잡한 레시피라는 뜻입니다. 일부는 너무 복잡해서 유지보수가 불가능하다고도 합니다. 버그를 수정하거나 변경을 가하려 하면 새로운 버그가 생길 가능성이 높습니다.

그들이 가진 안전장치는 결함이나 빈틈이 있습니다. 하지만 전체적으로 보면 안전 아키텍처는 카드 하우스와 같습니다. 스로틀 제어가 사라지는 동시에 다수의 안전장치가 동시에 비활성화될 가능성이 있습니다.”

바는 또한 토요타 프로그래머가 2007년 10월 문서에서 엔진 제어 애플리케이션을 “스파게티‑같다”고 표현한 점을 언급했습니다.

필립 쿱먼

카네기 멜론 대학 교수이자 안전‑중요 시스템 전문가인 쿱먼은 토요타의 엔지니어링 프로세스를 비판했습니다. 그는 1995년 모터 산업 소프트웨어 신뢰성 협회(MISRA)에서 제정한 업계 전반의 코딩 표준이 규칙 위반을 소프트웨어 버그와 연결한다는 점을 설명했습니다: 30건의 위반당 대략 작은 버그 3개와 큰 버그 1개가 발생합니다.

  • NASA 엔지니어들은 2010년 NHTSA를 위해 토요타 코드 일부를 검토하면서 7,134개의 MISRA‑C 위반을 발견했습니다.
  • 바가 2004년 MISRA 판을 기준으로 자체 검토한 결과 81,514개의 위반이 드러났습니다.

토요타는 MISRA 표준을 거부하고 자체 프로세스를 채택했으며, 이는 업계 표준과 거의 겹치지 않았습니다. 자체 가이드라인 내에서도 프로그래머들은 규칙을 자주 위반했고, 그 이탈을 문서화하지 않았습니다—이는 표준 안전‑엔지니어링 관행에 위배됩니다.

쿱먼은 안전은 개발 “레시피”에 처음부터 내재되어야 하며, 나중에 추가될 수 없다고 강조했습니다.

“안전‑중요 소프트웨어를 다룰 때는 큰 주의를 기울여야 합니다. 대충 해서는 안 됩니다. 토요타도 어느 정도 주의를 기울였지만, 안전‑중요 시스템을 설계하는 데 있어 받아들여지는 관행 수준에 도달하지 못했습니다.”

구체적인 소프트웨어 결함

단일 지점 실패

쿱먼은 토요타가 단일 지점 실패—그 실패만으로 전체 시스템이 위험해지는 구성 요소—를 허용했다고 강조했습니다. 그는 증언했습니다:

“단일 지점 실패가 존재한다면, 내가 본 모든 안전 기준에 따라 그것은 정의상 위험합니다. 아무리 많은 대책이나 안전장치를 추가해도 그 문제를 완전히 해결할 수 없습니다. 발생 빈도는 줄어들겠지만 완전히 없애지는 못합니다. 수백만 대의 차량이 존재하므로, 당신이 생각하지 못한 방식으로 실패가 발생하고 결국 실패하게 됩니다.”

과도한 전역 변수

안전‑중요 코드에 대한 학술적 표준은 전역 변수가 전혀 없어야 합니다. 토요타 코드에는 10,000개가 넘는 전역 변수가 포함되어 있었습니다. 쿱먼은 이렇게 말했습니다:

“실제로는 다섯 개, 열 개 정도면 괜찮지만, 10,000개라면 안 됩니다. 우리는 끝났습니다. 안전하지 않으며, 10,000개의 전역 변수가 있다는 사실만으로도 문제가 있다는 것을 알 수 있습니다.”

동료 검토 부재 및 소스 검사 누락

두 전문가 모두 동료 코드 검토가 없었고, 토요타가 덴소가 제공한 두 번째 CPU의 소스 코드를 검사하지 않은 점을 지적했습니다. 이는 의회와 NHTSA에 엔진 소프트웨어가 UA의 원인이 될 수 없다고 확신시킨 경영진의 주장과 모순됩니다.

태스크 종료와 “키친‑싱크” 태스크

바는 중요한 태스크(재판에서 Task X 로 불린)의 종료가 북아웃의 UA 사건을 일으켰을 가능성이 높다고 증언했습니다. 그는 Task X를 “키친‑싱크” 태스크라고 설명했는데, 이는 스로틀과 크루즈 컨트롤을 포함한 다수의 차량 기능을 제어했기 때문입니다.

결론

필립 쿱먼과 마이클 바의 증언은 기존 안전 표준 위반, 과도한 복잡성, 부adequate한 보호 장치가 난무하는 소프트웨어 개발 프로세스를 보여줍니다. 그들의 발견은 2005년식 캠리의 의도치 않은 가속 원인이 차량 하드웨어가 아닌, 차량 소프트웨어 아키텍처 깊숙이 내재된 문제였음을 시사합니다.

Back to Blog

관련 글

더 보기 »

Show HN: Detail, 버그 파인더

안녕 HN, tl;dr 우리는 버그 파인더를 만들었는데, 특히 앱 백엔드에서 정말 잘 작동하고 있어요. 한번 사용해보고 의견을 보내 주세요! 자세한 이야기는 아래에 있습니다.