[c] 캐스트 프리의 반환 값을 무효로하는 이유는 무엇입니까?

C를 사용 하는 책 ( POSIX Threads by Butenhof, 1997)을 읽고 있는데 다음 줄을 보았습니다.

(void)free(data);

여기, data할당 된 구조체에 대한 포인터입니다.

data = malloc(sizeof(my_struct_t));

결과 free가 캐스트 된 이유는 무엇 void입니까?

C에 대한 나의 이해에서 이것은 두 가지 이유로 이해되지 않는 것 같습니다.

  • 자유 함수는 이미 반환 void
  • 코드가 반환 값을 사용하지 않습니다 (변수에도 할당되지 않음)

이 책은 1997 년에 썼습니다. 이것은 일종의 유산입니까?

필자는 예제가 Digital Unix 4.0d에서 실행되었다고 언급하지만 그 결과를 사용하지 않을 경우 함수 결과를 캐스트해야 할 이유를 여전히 상상할 수 없습니다.



답변

우리가 표준 free기능 에 대해 이야기한다면 프로토 타입은

void free(void *ptr);

따라서 캐스트는 완전히 쓸모가 없습니다.
이제 몇 가지 추측.

작성자 stdlib.h가이 프로토 타입을 선언 하는 헤더 를 포함하지 않았을 수 있으므로 컴파일러는 리턴 유형을로 가정합니다 int. 이제이 코드를 정적 분석하는 동안 컴파일러는 void함수 가 아닌 것으로 생각되는 것의 사용되지 않은 반환 값에 대해 경고했습니다 . 이러한 경고는 일반적으로에 캐스트를 추가하여 침묵합니다 void.


답변

레거시 일 것입니다!

C 표준이 있기 전에는 free()함수가 (암시 적으로) 타입이었을 것입니다. int왜냐하면 void반환 할 타입이 아직 확실하지 않기 때문 입니다. 값이 반환되지 않았습니다.

표준 C 컴파일러에서 작동하도록 코드를 처음 수정했을 때는 포함되지 않았을 가능성이 높습니다 (표준보다 코드가 <stdlib.h>존재하지 않았기 때문). 오래된 코드를 작성합니다 extern char *malloc();(아마없이 extern할당 기능 (유사에 대한) calloc()realloc()), 및 선언에 필요하지 않았다 free(). 그리고 코드는 반환 값을 올바른 유형으로 캐스팅합니다. 왜냐하면 적어도 일부 시스템 (필자가 C를 배운 시스템 포함)에서 필요했기 때문입니다.

언젠가, (void)캐스트는 불만을 피하기 위해 lint“의 리턴 값 free()이 의도적으로 무시된다”고 컴파일러에게 알리기 위해 추가되었다 . 그러나 <stdlib.h>선언을 선언 하거나 컴파일러에게 무시할 가치가 없다고 extern void free(void *vp);알리는 것이 더 좋을 것 lint입니다.

JFTR : 80 년대 중반, ICL Perq는 원래 단어 중심 아키텍처에 있었고 char *메모리 위치 의 주소는 ‘anything_else 포인터’와 같은 위치와는 매우 다른 숫자였습니다. char *malloc()어떻게 든 선언하는 것이 중요했습니다 . 결과를 다른 포인터 유형으로 캐스트하는 것이 중요했습니다. 캐스트는 실제로 CPU가 사용하는 숫자를 변경했습니다. (시스템의 메인 메모리가 1MiB에서 2MiB로 업그레이드되었을 때 많은 기쁨이있었습니다. 커널이 약 3 / 4MiB를 사용했기 때문에 사용자 프로그램은 페이징 등을하기 전에 1 1 / 4MiB를 사용할 수있었습니다.)


답변

이 캐스트는 필요하지 않습니다. C가 C89 형식으로 표준화 되었기 때문에 아마도 당시에는 없었을 것입니다.

그랬다면 암시 적 선언 때문일 것 입니다. 이것은 일반적으로 코드를 작성하는 사람이 잊어 버렸고 #include <stdlib.h>정적 분석기가 사용되고 있음을 의미했습니다. 이것은 가장 좋은 해결 방법이 아니며 훨씬 더 나은 아이디어가 #include <stdlib.h>대신 되었을 것입니다. 암시 적 선언에 대한 C89의 문구는 다음과 같습니다.

함수 호출에서 괄호로 묶은 인수 목록 앞에 오는 표현식이 식별자로만 구성되어 있고이 식별자에 대한 선언이 표시되지 않으면 함수 호출을 포함하는 가장 안쪽 블록에서 선언처럼 정확하게 식별자가 암시 적으로 선언됩니다.

extern int identifier();

나타났다.

그들은 결과 캐스팅하지 않을 때문에 그러나 그것은 이상한 malloc중 하나를, 그리고 mallocfree같은 헤더 파일에 있습니다.

이것은 단지 실수이거나 독자에게 free결과 를 반환하지 않는다고 알려주는 방법 일 수도 있습니다.


답변