9.3.4.1 암시적 형변환(Implicit Type Conversion)이 유발하는 런타임 함정 탐지
자바스크립트(JavaScript)나 파이썬(Python)과 같은 동적 타입 언어들의 이면에는 기계 스스로 타입 간의 연산을 어설프게 맞춰주려는 이른바 **‘암시적 형변환(Implicit Type Conversion/Type Coercion)’**이라는 함정이 도사리고 있다.
자바스크립트에서 "5" + 2는 7이 되지 않고 "52"라는 문자열이 되며, 빈 배열 []은 조건문 안에서 true로 돌변한다. 문제는 LLM이 코드를 짜 내려갈 때 이러한 언어 특유의 기괴한 형변환 편법들을 무의식적으로 코드베이스 스니펫(Snippet)에서 복사해와 그대로 쏟아낸다는 점이다. 이는 당장의 유닛 테스트(Unit Test)를 아슬아슬하게 통과할지는 몰라도, 상용 환경(Production)에서 예기치 않은 사용자 입력값을 만나면 시스템 로직을 조용히 역전시키는 심비오트(Symbiote) 같은 버그로 자라난다.
오라클 시스템은 타입이 ’안전하게 명시되어 있는가’를 넘어서, 서로 다른 타입 간의 위험한 교배(Crossing)가 암시적으로 일어나고 있는지 타겟팅하여 필터링해야 한다.
1. 엄격한 동등성 연산자(Strict Equality)의 강제
자바스크립트 환경에서 LLM이 코드 생성을 시도할 때, 오라클 Linter 파이프라인(예: ESLint 연동)이 가장 먼저 눈을 부릅뜨고 찾아야 할 것은 == (느슨한 동등성) 연산자다.
LLM은 종종 if (inputValue == 0)과 같은 구문을 작성한다. 이 덫을 통과하면 inputValue에 거짓을 상징하는 false나 빈 문자열 ""이 들어와도 암시적 형변환에 의해 true로 평가되는 끔찍한 사태가 벌어진다.
오라클은 AST 트리의 BinaryExpression을 뒤져 오퍼레이터(Operator)가 == 또는 !=로 작성된 모든 노드를 적발한다. 이를 발견하는 즉시 **“암시적 형변환 위험: 연산자 ==를 금지합니다. 값과 타입을 동시에 비교하는 === 또는 !==로 코드를 수정하십시오”**라는 진단 메시지를 타겟 LLM으로 피드백하여, AI가 강제로 안전한 타입 비교 규격(Strict Equality)을 준수하도록 유도한다.
2. 혼합 타입 산술 연산(Mixed-Type Arithmetic)의 정적 스캔
파이썬 환경에서는 문자열과 정수의 덧셈("Value: " + 5)을 시도할 경우 즉각적으로 TypeError가 터져 비교적 안전하지만, 자바나 C++ 환경처럼 형변환 규칙이 복잡하게 얽혀 있는 언어에서는 LLM이 만들어낸 타입 체커를 우회하는 미묘한 연산들이 런타임을 위협한다.
특히 LLM은 배열(Array)이나 객체(Object)를 원시 타입(Primitive Type)과 trực tiếp 산술 연산하려는 기이한 코드를 작성할 때가 있다.
- TypeScript 기반 오라클은
ts.TypeCheckerAPI를 활용하여 이항 연산자(Binary Operator) 좌우의 AST 노드가 가진 최종 추론 타입(Resolved Type)을 가져온다. - 만약 왼쪽이
number이고 오른쪽이any[](배열)라면, 비록 TS 컴파일러가 이를 어떻게든 컴파일해 내려고 발악할지언정, 보안 오라클은 이를 명백한 ‘형변환 인지 실패(Type Coercion Failure)’ 징후로 단정 짓고 빌드를 차단한다. - 이를 통해
[1,2] + 3이"1,23"이라는 끔찍한 문자열로 암시적 캐스팅되는 사태 자체를 코드 레지스트리 이전에 소각해버릴 수 있다.
3. Truthy/Falsy 안티 패턴의 식별과 불리언 캐스팅(Boolean Casting) 강제화
LLM이 자주 저지르는 또 하나의 악질적 패턴은 분기문 조건에 데이터를 통째로 던져 넣고 언어의 묵시적인 Truthy/Falsy 평가에 로직의 운명을 맡겨버리는 행위다.
예를 들어 파이썬에서 if data: 라고 썼을 때, 인간은 이것이 리스트가 비어있지 않거나 객체가 None이 아님을 의미한다는 것을 알지만 명시적이지 않다. 오라클의 타입 린팅 파이프라인(예: Ruff나 Flake8의 커스텀 룰)은 이런 묵시적 캐스팅 코드를 모두 찾아낸다.
오라클은 분기문의 Test 항목이 명시적인 불리언 연산(if len(data) > 0: 혹은 if data is not None:)으로 이루어지지 않았을 경우 이를 타입 모호성(Type Ambiguity)으로 규정한다. 이러한 묵시적 형변환의 소거 작업은 LLM의 코드로부터 마법(Magic)을 걷어내고, 오직 기계가 오차 없이 읽어낼 수 있는 명시적이고 건조한 엔지니어링 팩트(Fact)만을 남기도록 강제하는 과정이다.