GOTO는 정말 끝내준다(C 오류 처리에서)

1 hour ago 3

C에서 오류 분기마다 자원을 정리하는 대신, 함수 끝에 공통 정리 경로를 두고 goto로 이동하면 정리 코드의 중복과 분기별 차이를 줄일 수 있음 Go의 defer 와 Zig의 errdefer 는 자원 정리를 쉽게 해주지만, 이런 기능이 없는 C에서는 오류 처리의 제어 흐름을 미리 설계해야 함 정상 반환문 뒤에 정리 코드를 배치하면 성공 시에는 건너뛰고 오류 시에만 실행하는 유사 errdefer 패턴을 만들 수 있음 개선 예제는 파일 작업 직후 파일 디스크립터를 닫고, 메모리 해제는 하나의 레이블로 모아 오류 분기마다 다른 정리 코드를 작성하지 않도록 함 정리할 자원의 범위가 다르면 여러 레이블로 나눌 수도 있으며, Linux 커널 코딩 스타일 가이드도 함수 종료 경로를 중앙화하는 이 패턴을 다룸 Go와 Zig의 지연 실행 기반 자원 정리 Go에서는 오류를 부가 정보로 감싸 호출 스택 위로 전달하고, 상위 호출자가 처리하도록 할 수 있음 잠금 직후 defer d.Unlock() 을 등록하면 오류로 반환하더라도 잠금을 해제함 수동 메모리 할당을 하지 않으므로 오류 발생 시 할당한 메모리를 직접 해제하는 부담이 없음 Zig는 수동 메모리 관리가 필요하지만, errdefer로 오류 발생 전까지 성공한 할당을 정리할 수 있음 장난감 멀티플렉서의 초기화 예제는 셸 문자열, POSIX 환경 블록, 탭 배열, 파이프 배열을 차례로 할당하고 각각 정리 작업을 등록함 함수가 오류를 반환하면 등록한 작업이 역순으로 실행되므로, 어느 자원을 해제해야 하는지 직접 추적할 필요가 없음 예제는 Reserve First 패턴을 따르며, 모든 할당과 오류 발생 가능 작업을 마친 위치에 errdefer comptime unreachable 을 둠 C에서 오류 분기마다 정리할 때 생기는 복잡성 C에는 defer와 errdefer가 없어, 이에 익숙한 상태에서 오류 처리 흐름을 미리 계획하지 않으면 정리 코드가 복잡해질 수 있음 초기 예제는 포인터 배열을 할당한 뒤, 각 경로마다 구조체 할당, 파일 열기, fstat 호출을 수행하고 파일 크기를 구조체에 저장함 구조체 할당 실패 시에는 현재 인덱스 이전의 구조체만 해제함 파일 열기 실패 시에는 현재 인덱스의 구조체까지 해제하므로 반복 조건이 j < i에서 j <= i로 달라짐 fstat 실패 시에는 같은 메모리 해제에 더해 파일 디스크립터도 닫아야 함 오류 분기마다 정리 범위가 조금씩...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵