free ()는 errno를 설정합니까?
경우 buf
A는 malloc()
할당 된 문자 버퍼, 않습니다 free(buf)
설정 / 재설정 errno
?
더 이상 필요하지 않으므로 버퍼를 파일에 쓰고 해제하고 싶다고 가정 해 보겠습니다.
코드에 대한 오류 정책이 오류에 대해 -1을 반환하는 것이라고 가정 해 보겠습니다.
메모리 누수없이 버퍼 및 오류 검사를 작성하는 적절한 방법입니까?
fputs(buf, somefile);
free(buf);
if (errno) return -1;
아니면 errno를 무료로 설정할 필요가 있습니까?
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를 설정하는지 여부에 따라 달라집니다.
무료 리눅스 맨 페이지 () 도에 대한 매뉴얼 페이지입니다 malloc()
등이 언급 malloc()
errno를 설정,하지만 free()
.
동적 메모리를 확보하기위한 GNU C 라이브러리 매뉴얼 페이지 ) (무료 errno는 설정할지 여부를 언급하지 않습니다.
그래서 나는 free ()가 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는 free
설정을 정의 errno
하지 않습니다 (현재 POSIX 가이 를 금지하지는 않으므로 구현에서 그렇게 할 수 있습니다- 자세한 내용은 @ArjunShankar의 답변 을 참조하십시오). 그러나 그것은 당신의 우려와 실제로 관련이 없습니다.
The way you're checking for errors is incorrect. You should check the return value of fputs
, and check if it's smaller than 0
. If it is, then you can check errno
to find out what caused the failure, but that's optional (and should be done before calling any further functions).
So, something like this should do the trick :
int result = fputs(buf, somefile);
/* optionally read errno here if result < 0 (before the free call) */
free(buf);
return (result < 0) ? -1 : 0;
A POSIX compliant free
might set errno
today but this is going to change for the better in the future. Details:
- The The Open Group Base Specifications Issue 7 definition of
errno
states the following:
No function in this volume of POSIX.1-2008 shall set errno to 0. The setting of errno after a successful call to a function is unspecified unless the description of that function specifies that errno shall not be modified.
- The definition of
free
itself does not specify whatfree
does witherrno
.
What this means is that a compliant free
implementation will never reset errno
to 0. But it may or may not set it to a non-zero value.
However, Issue 8 (a work in progress) of the specification will require free
to specifically guarantee that it will not set errno
when passed a valid input.
glibc is already gearing up to adhere to this new requirement.
There is nothing said about errno
in the description of free
in the C Standard. So you may not rely on this feature.
According to the C Standard (7.5 Errors <errno.h>
)
3...The value of errno may be set to nonzero by a library function call whether or not there is an error, provided the use of errno is not documented in the description of the function in this International Standard.
And the use of errno
is not documented in the description of free
in the C Standard as I have already said above.
If the reference doesn't say that a function returns an error code in errno
on failure, it won't.
Functions that set errno
to an error code (almost) always signal in another way that errno
contains the current error code - the memory allocation functions return NULL
, many other functions return zero or a negative number, and so on.
Such functions are not required to modify errno
in any way if they succeed, and usually don't.
You usually can't inspect errno
to determine whether something went wrong; it is only meant for retrieving more information once you know that there has been an error.
One exception to the final rule is the strto{l, d, ul}
family, but the first paragraph is true for those as well.
And they also don't necessarily set errno
except when they fail, so you need to clear it first or it may contain a stale error code.
you can use RAII to free malloced memory, and check the return value of fputs. That will be grace code.
//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' 카테고리의 다른 글
특성과 정책의 차이점은 무엇입니까? (0) | 2020.12.08 |
---|---|
"using namespace std"의 용도는 무엇입니까? (0) | 2020.12.08 |
Android 레이아웃 : 스크롤 동작이있는 Viewpager 내부의 Vertical Recyclerview 내부의 Horizontal Recyclerview (0) | 2020.12.08 |
Lisp 실행 파일 (0) | 2020.12.08 |
ASP.NET 웹 사이트에서 Elmah 보안 (0) | 2020.12.08 |