제로 사이즈 말로크
매우 간단한 질문으로, 나는 다음과 같은 프로그램을 만들었다.
#include <stdlib.h>
int main(int argc, char ** argv)
{
void * ptr;
ptr = malloc(0);
free(ptr);
}
그리고 그것은 내 기계에 결함이 없다.그것은 stdlib malloc과 무료의 휴대용 행동인가? 아니면 내가 문제를 찾고 있는가?
편집 : 휴대성이 없어 보이는 것은 말로크가 반환한 값이다.문제는 ptr의 값이 아니라 malloc(0)+자유 조합에 관한 것이다.
동작은 구현이 정의되어 있으며, NULL 포인터 또는 주소를 받게 된다.그러나 다음과 같은 이유로 수신된 포인터를 자유롭게 호출해도 문제가 발생하지 않아야 한다.
- free(NULL)는 정상이며, 작업이 수행되지 않음
- malloc(또는 calloc 등)에서 주소를 수신한 경우 free(주소)는 정상임
NULL을 반환할 수 있고, NULL이 아닌 포인터를 반환할 수 있으며, 취소할 수 없는 포인터가 반환할 수 있다.두 가지 방법 모두 표준(7.20.3):
요청된 공간의 크기가 0인 경우, 동작은 구현 정의된다. 즉, null 포인터가 반환되거나, 반환된 포인터가 객체에 접근하는 데 사용되어서는 안 된다는 점을 제외하고, 동작은 크기가 0이 아닌 어떤 값인 것처럼 된다.
c기준에 따라
7.20.3 요청된 공간의 크기가 0인 경우, 그 동작은 구현으로 정의된다: null 포인터를 반환하거나, 또는 그 크기가 0이 아닌 어떤 값인 것처럼 행동한다. 단, 반환된 포인터를 물체에 접근하기 위해 사용해서는 안 된다.
귀찮게 해서 미안해, 내가 남자 페이지를 읽었어야 했는데.
malloccript는 크기 바이트를 할당하고 할당된 메모리에 포인터를 반환한다.기억이 지워지지 않는다.크기가 0이면 malloc()는 NULL 또는 나중에 free()로 성공적으로 전달할 수 있는 고유한 포인터 값을 반환한다.
free()는 ptr이 가리키는 메모리 공간을 자유롭게 해주는데, 이것은 malloccular calloc() 또는 realloc()에 대한 이전의 호출에 의해 반환된 것이 틀림없었다.그렇지 않으면, 또는 이전에 프리(ptr)를 이미 호출한 경우 정의되지 않은 동작이 발생한다.ptr이 NULL이면 조작이 수행되지 않는다.
적어도 gnu libc에게는 사실인 것 같다.
내 경험에 의하면, 나는 malloc(0)이 자유로워질 수 있는 포인터를 돌려주는 것을 보았다.그러나 이것은 나중에 malloc() 문장에서 SIGSEGV를 유발한다.그리고 이것은 매우 무작위적이었습니다.
내가 수표를 추가했을 때, 할당될 크기가 0이면 malloc를 부르지 않기 위해, 나는 이것을 없앴다.
그래서 나는 0사이즈에 메모리를 할당하지 않는 것을 제안하고 싶다.
-아슈토시
libt & Pax의 의견을 고려하여 업데이트됨:
malloc(0)를 호출하는 동작은 구현에 따라 다르거나 다른 말로 하면 휴대할 수 없는 동작이다.
정의되지 않은
자세한 내용은 CFaq 질문에 연결하십시오.
합법적인 C/C++일 수도 있지만, 더 큰 문제를 나타낸다.나는 그것을 일반적으로 '점점 슬러피'라고 부른다.
malloc(0) 또는 calloc(0) 결과에 대해 가정하지 마십시오," https://www.securecoding.cert.org/confluence/display/seccode/VOID+MEMxx-A.+Do+not+make+assumptions+about+the+result+of+malloc%280%29+or+calloc%280%29를 참조하십시오.
참조URL: https://stackoverflow.com/questions/1073157/zero-size-malloc
'programing' 카테고리의 다른 글
역 엔지니어링으로부터 실행 파일을 보호하시겠습니까? (0) | 2022.05.24 |
---|---|
Vue의 스토어에서 Getter from Store from Vue return is isLoggedIn(상태 (0) | 2022.05.24 |
프록시 뒤에서 Maven 및 SSL 사용 문제 (0) | 2022.05.24 |
Vue.js/Vuex 로그인: [vuex] 알 수 없는 작업 유형: postLogin. (0) | 2022.05.24 |
TypeError: 원형 구조를 JSON Vuejs로 변환 (0) | 2022.05.24 |