free()는 errno를 설정합니까?
ifbuf
는 입니다.malloc()
buffer, does "char", "does."free(buf)
set/set/set/set(설정)errno
버퍼를 파일에 쓴 후 해방한다고 칩시다.더 이상 필요없기 때문입니다.
코드의 에러 정책은, 에러에 대해서 -1을 반환하는 것이라고 합니다.
메모리 누전 없이 버퍼와 에러 체크를 기입하는 것이 적절한 방법입니까?
fputs(buf, somefile);
free(buf);
if (errno) return -1;
또는 다음과 같이 에러노 설정을 무료로 할 필요가 있습니까?
fputs(buf, somefile);
if (errno){
free(buf);
return -1;
}
free(buf);
아니면 공포에 대한 공포,
do {
fputs(buf, somefile);
int save_errno = errno;
free(buf);
errno = save_errno;
if (errno) return -1;
} while(0);
여기서 블록을 사용하면 로컬 save_errno가 여러 곳에 존재할 수 있습니다.
이 모든 것은 free()가 errno를 설정하는지 여부에 따라 달라집니다.
linux man 페이지 for free()는 man 페이지이기도 합니다.malloc()
, 이에요. 이에요.malloc()
, errno, "errno"는 아님), "errrno"의free()
동적 메모리를 해방하기 위한 GNU C 라이브러리의 매뉴얼페이지에는 free()가 errno를 설정할지는 기재되어 있지 않습니다.
free() reset errno를 확인할 수 있도록 쓰기 오류를 강제하기 위해 짧은 프로그램을 작성했지만 그렇지 않습니다.이 결과에 의존해야 하는지, 그리고 free()가 매우 중요하기 때문에 "물론 errno는 설정되지 않는다"는 사실에 대해 고민하고 있습니다.
# See if free() resets errno on a bad write
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
char * buf = malloc(256);
snprintf(buf,256,"%s\n", "Hello, World!");
FILE *badfile;
badfile = fopen("/dev/null","r");
fputs(buf, badfile);
free(buf);
printf("%d\n", errno);
printf("%s\n", strerror(errno));
}
POSIX는 설정할 것을 정의하지 않습니다.errno
(현재 POSIX에서는 금지하고 있지 않기 때문에, 실장에서는 금지하고 있을 가능성이 있습니다.자세한 것은, @ArjunShankar의 회답을 참조해 주세요).하지만 그건 당신 걱정과는 상관이 없어요.
당신이 오류를 확인하는 방법이 틀렸어요.해야 합니다.fputs
.0
.errno
에러의 원인을 특정합니다만, 이것은 옵션입니다(더 이상의 함수를 호출하기 전에 실행해 주세요).
따라서 다음과 같은 방법으로 효과를 볼 수 있습니다.
int result = fputs(buf, somefile);
/* optionally read errno here if result < 0 (before the free call) */
free(buf);
return (result < 0) ? -1 : 0;
준거 POSIX ™free
할 수 있다errno
하지만 이것은 미래에 더 나은 방향으로 바뀔 것입니다.세부사항:
- Open Group Base Specifications Issue 7(오픈 그룹 기반 사양 문제 7)의 내용은 다음과 같습니다.
이 POSIX.1-2008 볼륨의 어떤 함수도 errno를 0으로 설정할 수 없습니다.함수 호출 성공 후 errno 설정은 해당 함수의 설명에서 errno를 변경하지 않는 한 지정되지 않습니다.
- 정의 자체에는 무엇을 명시하지 않습니다.
free
사용하다errno
.
이게 의미하는 건 고분고분하게free
구현이 리셋되지 않음errno
0까지. 단, 0이 아닌 값으로 설정되거나 설정되지 않을 수 있습니다.
다만, 이 사양의 제8호(진행중의 작업)에서는, 유효한 입력이 건네졌을 때에 설정되지 않는 것을 특별히 보증할 필요가 있습니다.
glibc는 이미 이 새로운 요건을 준수하기 위한 준비를 하고 있습니다.
에 대해서는 아무 말도 없다.errno
의 설명에 있어서free
C표준에 기재되어 있습니다.따라서 이 기능에 의존하지 않아도 됩니다.
C기준(7.5오류)에 준거<errno.h>
)
3...오류 발생 여부에 관계없이 라이브러리 함수 호출에 의해 errno 값이 0이 아닌 값으로 설정될 수 있습니다.단, errno의 사용은 본 국제표준의 함수 설명에 기재되어 있지 않습니다.
또,errno
설명에 기재되어 있지 않다free
위에서 이미 말한 바와 같이 C 표준에서.
참조에서 함수가 에러 코드를 반환하지 않는 경우errno
실패하면 안 돼
설정하는 기능errno
에러 코드에 대해서(거의) 항상 다른 방법으로 신호를 보냅니다.errno
현재 오류 코드가 포함되어 있습니다. 메모리 할당 함수가 반환됩니다.NULL
, 다른 많은 함수는 0 또는 음수를 반환합니다.
이러한 함수는 수정할 필요가 없습니다.errno
어떤 식으로든 성공한다면, 그리고 보통 성공하지 못한다.
일반적으로는 검사할 수 없습니다.errno
에러가 발생했는지 아닌지를 판별합니다.이것은, 에러가 발생한 것을 알고 나서의 추가 정보의 취득만을 목적으로 하고 있습니다.
최종 규칙의 한 가지 예외는strto{l, d, ul}
가족, 하지만 첫 번째 단락은 가족에게도 해당 가족에게도 해당됩니다.
그리고 그들은 또한 그들이 반드시errno
에러가 발생했을 경우를 제외하고, 우선 클리어 할 필요가 있습니다.그렇지 않으면 오래된 에러 코드가 포함되어 있을 수 있습니다.
yes free()는 다양한 시스템에서 clobber errno를 실행할 수 있습니다.gnulib는 이러한 플랫폼에서 free()를 대체함으로써 이 문제를 회피합니다.이 플랫폼에는 현재 "glibc 2.32, Mac OS X, FreeBSD, OpenBSD 4.4, Minix, AIX, HP-UX, IWin, CYG, CYG"가 문서화되어 있습니다.
RAII 를 사용하면, malloosed 메모리를 해방해, fput 의 반환치를 확인할 수 있습니다.그건 유예규정이 될 거야
//if malloc successfully
AutoFree af(buf);
if (fputs(buf, somefile)) {
LOG("something err:%s", strerror(errno));
}
return 0;
언급URL : https://stackoverflow.com/questions/30569981/does-free-set-errno
'programing' 카테고리의 다른 글
v-model 특성을 확인란에 추가하면 모두 확인 작업이 중지됨 (0) | 2022.07.13 |
---|---|
배경 클릭 시 모달 닫힘 방지 [Vuejs] (0) | 2022.07.13 |
컴포넌트 메서드를 모사하는 방법 (0) | 2022.07.13 |
Quasar Framework q-select가 v-모델의 개체를 ID보다 높게 설정함 (0) | 2022.07.13 |
Java 패키지 이름에서 단어 구분 기호 표기법은 무엇입니까? (0) | 2022.07.12 |