glibc의 fclose(NULL)이 오류를 반환하지 않고 세그먼트화 오류를 발생시키는 이유는 무엇입니까?
.fclose(3)
:
반환 값
성공적으로 완료되면 0이 반환됩니다. 않으면,면,
EOF
수.errno
오류를 나타내도록 설정됩니다.또 스(함) )fclose()
스트림에 대해 정의되지 않은 동작이 발생합니다.오류
EBADF
파일 :fp
유효하지 않습니다.
fclose()
다를 .errno
된 오류가 확인합니다.close(2)
,write(2)
아니면fflush(3)
.
이야입니다.fclose(NULL)
합니다를 합니다.errno
분할 결함에 의해 직접 죽는 대신 일반적으로.이런 행동에 무슨 이유라도 있습니까?
미리 감사드립니다.
를 합니다).strerror()
),).
FILE *not_exist = NULL;
not_exist = fopen("nonexist", "r");
if(not_exist == NULL){
printError(errno);
}
if(fclose(not_exist) == EOF){
printError(errno);
}
fclose
다합니다.FILE
포인터는 다음 중 하나에 의해 얻어집니다.fopen
인 .stdin
,stdout
, 아니면stderr
즉 .는 이러한 중 Null다와 . 마찬가지로fclose((FILE *)0xdeadbeef)
되지요.NULL은 C에서 특별한 것이 아닙니다; 유효한 포인터와 동등하지 않은 것을 비교하는 것이 보장되는 것을 제외하고는, 다른 유효하지 않은 포인터와 마찬가지로, 이 포인터를 사용하면 계약의 일부로서 문서에 전달하는 인터페이스를 제외하고는 정의되지 않은 동작을 호출합니다.NULL
특별한 의미가 있습니다
또한 오류와 함께 반환하는 것은 (어쨌든 동작이 정의되지 않았기 때문에) 구현에는 유효하지만 정의되지 않은 동작을 숨기기 때문에 유해한 동작입니다.정의되지 않은 동작을 호출할 때 선호하는 결과는 항상 오류를 강조하고 수정할 수 있기 때문에 충돌입니다.대부분의 사용자:fclose
오를 사람들이라고 그리고 대부분의 사람들이 통과할 만큼 어리석은 사람들이라고 장담합니다.NULL
.fclose
입니다의 할 만큼 입니다.fclose
. 사람들이 반환 값을 확인해야 한다는 주장이 제기될 수 있습니다.fclose
할 수 있기 으로,에,다,의 경우에는 이것이 .fflush
되었습니다 전에 되었습니다.fclose
(파일이 열려 있는 상태에서 오류를 처리하는 것이 더 쉽기 때문에 어쨌든 더 똑똑한 관용구입니다.)
fclose(NULL)
성공해야 합니다.free(NULL)
성공합니다. 그래야 정리 코드를 더 쉽게 쓸 수 있기 때문입니다.
유감스럽게도, 그것은 그렇게 정의되지 않았습니다.다를 수 .fclose(NULL)
(예: http://pubs.opengroup.org/onlinepubs/9699919799/) 참조).
다른 사람들이 언급한 것처럼 NULL을 잘못된 곳으로 전달하는 경우 일반적으로 오류 반환을 원하지 않습니다.최소한 디버그/테스트 빌드에 대한 경고 메시지가 필요합니다.참조 해제 NULL은 즉시 경고 메시지를 제공하고 프로그래밍 오류를 식별하는 역추적을 수집할 수 있는 기회를 제공합니다.프로그래밍하는 동안 segfault는 당신이 얻을 수 있는 최고의 오류입니다.C에는 더 많은 미묘한 오류들이 있고, 디버그하는 데 훨씬 더 오래 걸립니다...
오류 반환을 악용하여 프로그래밍 오류에 대한 견고성을 높일 수 있습니다.그러나 소프트웨어 충돌로 데이터가 손실될 것을 우려하는 경우 하드웨어의 전원 공급이 끊길 경우에도 동일한 일이 발생할 수 있습니다.그래서 (ex와 vi와 같이 두 글자로 된 이름을 가진 유닉스 텍스트 편집기 때문에) 자동 저장이 가능합니다.소프트웨어가 일관되지 않은 상태로 계속 유지되는 것보다 눈에 띄게 충돌하는 것이 더 나을 것입니다.
맨 페이지에서 말하는 오류는 프로그래밍 오류가 아닌 런타임 오류입니다.요만 하면 안 NULL
포인터를 기대하고 해당 API가 합리적인 작업을 수행하기를 기대합니다. 통과.NULL
데이터에 대한 포인터가 필요하도록 문서화된 함수에 대한 포인터는 버그입니다.
관련 질문:C 또는 C++에서 NULL/nullptr에 대해 포인터 매개 변수를 확인해야 합니까?
그 질문에 대한 답 중 하나에 대한 R.의 의견을 인용하자면:
... 운영 환경의 예외적인 조건(fs full, out-memory, network down 등)에서 발생하는 오류를 프로그래밍 오류와 혼동하는 것 같습니다.전자의 경우, 물론 강력한 프로그램이 그것들을 우아하게 다룰 수 있어야 합니다.후자의 경우, 강력한 프로그램은 처음부터 그것들을 경험할 수 없습니다.
.fclose()
이 문제는 FreeBSD의 유산으로 보이며 마이크로소프트와 리눅스 진영에서 무비판적으로 받아들여졌습니다.
HP, SGI, Solaris, CYGWIN 입니다를 fclose(NULL)
이치에 맞는예를들면,man fclose
OP의 glibc 대신 newlib을 사용하는 CYGWIN의 경우 다음과 같이 말합니다.
fclose가 성공한 경우(FP가 NULL이거나 파일이 열려 있지 않은 경우 포함) 0을 반환합니다.
관련된 토론은 https://stackoverflow.com/a/8442421/318716 를 참조하십시오.
manpage는 기본 파일 기술자(내부적으로 파일 기술자를 통해 얻은 기술자)에 대해 이야기하는 것 같습니다.open
시 fopen
전달할 파일 포인터가 아닌 유효하지 않음fclose
.
언급URL : https://stackoverflow.com/questions/16922871/why-glibcs-fclosenull-cause-segmentation-fault-instead-of-returning-error
'source' 카테고리의 다른 글
WooCommerce 가변상품 공지사항 이슈 - 상품 옵션을 선택해주세요 (0) | 2023.10.14 |
---|---|
WooCommerce에서 모든 주문 상태의 민달팽이와 이름을 얻는 방법은? (0) | 2023.10.14 |
검색 옵션을 사용하여 선택 상자 만들기 (0) | 2023.10.14 |
예외:'닫힘'을(를) 직렬화할 수 없습니다. (0) | 2023.10.14 |
반복 합계에 우커머스 구독 사용자 지정 수수료 추가 (0) | 2023.10.14 |