C 언어의 정의되지 않은 동작 줄이기

11 hours ago 3

C 표준 위원회가 정의되지 않은 동작(UB) 을 줄이고 있으며, 진행 중인 C2y 초안은 기존 표준의 약 100개 UB 항목 중 45개를 제거함 UB가 있는 프로그램에는 표준이 요구사항을 부과하지 않아, 컴파일러의 공격적인 최적화와 개발자가 기대하는 실행 결과 사이에 충돌이 생김 C23은 이후 발생할 UB를 근거로 앞선 관찰 가능한 동작까지 바꾸는 최적화를 막는 “시간 역행 금지” 규정을 추가했지만, 표준 해석과 컴파일러 구현의 불일치는 여전히 남아 있음 컴파일러 경고, 정적 분석기, 새니타이저와 언어 기능 개선으로 타입 안전성과 메모리 안전성을 높일 수 있으나, 해제 후 사용 같은 시간적 안전성 문제는 더 어려움 완전한 메모리 안전성에는 비용이 큰 런타임 검사나 형식 검증이 필요함. 가까운 시기에는 사용 가능한 언어 기능을 제한하고 형식 검증을 결합하는 방식이 가장 완전한 결과를 낼 수 있음 C의 장점과 추상 기계 모델 Kernel Recipes에서 Martin Uecker는 C의 UB 문제와 장기적으로 메모리 안전한 언어가 될 가능성을 다룸 C는 이식성, 장기적 안정성을 갖추고 있으며, 컴파일과 생성된 바이너리의 실행이 빠름 코드를 보고 컴퓨터가 실제로 수행할 일을 파악하기 쉽고, 도구가 풍부하며, 필요할 때 개발자의 작업을 가로막지 않음 C89는 부호와 크기 표현, 1의 보수 정수 표현, 세그먼트 메모리, 특이한 포인터 표현과 타입 크기를 사용하는 다양한 하드웨어를 수용해야 했음 일부 Honeywell 시스템은 9비트 바이트를 사용했으며, 이런 차이가 이식 가능한 코드를 위한 표준 작성을 복잡하게 만듦 이를 위해 언어의 의미를 추상 기계로 정의하고, 실제 하드웨어가 달라도 프로그램의 관찰 가능한 동작은 추상 기계에서 실행한 결과와 같도록 함 volatile 변수 접근은 관찰 가능한 동작이므로 추상 기계의 규칙대로 이루어져야 함 나머지 연산은 같은 최종 결과를 내는 한 컴파일러에 큰 자유가 주어짐 C 표준이 제약하지 않는 영역에서도 ABI, POSIX, 하위 호환성 요구사항은 컴파일러 구현을 제약할 수 있음 정의되지 않은 동작이 허용하는 범위 정의되지 않은 동작은 프로그램이 이식 가능하지 않거나 표준이 정의하지 않은 일을 할 때 발생하며, C89는 이 경우 구현에 “아무런 요구사항도 부과하지 않는다”고 규정함 UB는 언어 확장과 공격적인 최적화를 허용하고, 하드웨어 안전장치와의 상호작용을 처리하며, 탐지하기...

Read Entire Article