programing

free()는 errno를 설정합니까?

bestcode 2022. 7. 13. 23:18
반응형

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 하지만 이것은 미래에 더 나은 방향으로 바뀔 것입니다.세부사항:

  1. Open Group Base Specifications Issue 7(오픈 그룹 기반 사양 문제 7)의 내용은 다음과 같습니다.

이 POSIX.1-2008 볼륨의 어떤 함수도 errno를 0으로 설정할 수 없습니다.함수 호출 성공 후 errno 설정은 해당 함수의 설명에서 errno를 변경하지 않는 한 지정되지 않습니다.

  1. 정의 자체에는 무엇을 명시하지 않습니다.free 사용하다errno.

이게 의미하는 건 고분고분하게free구현이 리셋되지 않음errno0까지. 단, 0이 아닌 값으로 설정되거나 설정되지 않을 수 있습니다.

다만, 이 사양의 제8호(진행중의 작업)에서는, 유효한 입력이 건네졌을 때에 설정되지 않는 것을 특별히 보증할 필요가 있습니다.

glibc는 이미 이 새로운 요건을 준수하기 위한 준비를 하고 있습니다.

에 대해서는 아무 말도 없다.errno의 설명에 있어서freeC표준에 기재되어 있습니다.따라서 이 기능에 의존하지 않아도 됩니다.

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

반응형