2013-08-09 1 views
4

의 glibc는 일부 힙 검사를 수행하는 하나 개 이상의 방법이 보인다 다음 M_CHECK_ACTION 매개 변수를glibc의 MALLOC_CHECK_, M_CHECK_ACTION 및 mcheck의 차이점은 무엇입니까?

  1. mallopt을
  2. 변수 MALLOC_CHECK_ 환경
  3. 기능
  4. 내가 찾을

의 mcheck의 가족 사용 가능한 설명서가 혼란 스럽습니다. manual은 mallopt를 설명 할 때 M_CHECK_ACTION을 전혀 나열하지 않습니다. 그러나 This mallopt man page이고은 M_CHECK_ACTION을 설명합니다. 또한, 그것은 환경 변수 MALLOC_CHECK_에 해당 말한다 :

MALLOC_CHECK_ 
      This environment variable controls the same parameter as 
      mallopt() M_CHECK_ACTION. If this variable is set to a 
      nonzero value, then a special implementation of the memory- 
      allocation functions is used. (This is accomplished using the 
      malloc_hook(3) feature.) This implementation performs 
      additional error checking, but is slower than the standard set 
      of memory-allocation functions. 

glibc는 설명서가 mcheck and friends위한 페이지를 가지고 있으며, "힙 일관성 검사"로 설명합니다. 이 매뉴얼은 MALLOC_CHECK_에 대해 설명이 페이지에 :

또 다른 가능성을 확인의 malloc, realloc과의 사용에 버그를 방지하고 자유로운 환경 변수 MALLOC_CHECK_를 설정하는 것입니다. MALLOC_CHECK_이 설정되면, 같은 인수를 가진 double의 호출이나 단일 바이트의 오버런 (by-by-one 버그)과 같은 단순한 오류에 대해 견딜 수 있도록 고안된 특수 (비효율적 인) 구현이 사용됩니다.

mcheck 등은 MALLOC_CHECK_/M_CHECK_ACTION 대신 사용할 수 있습니까?

또한이 유용한 도움이되는 일관성 검사를 어떻게 비활성화 할 수 있습니까? man 페이지는 MALLOC_CHECK_ (그리고 M_CHECK_ACTION)을 0으로 설정하면 "메모리 할당 함수의 특별한 구현"을 사용하지 않을 것이라고 말합니다. 그러나 glibc 매뉴얼에는 "MALLOC_CHECK_이 설정되면 특수 (덜 효율적인) 구현이 사용됩니다." 0으로 설정된 환경 변수가 여전히 설정되어 있으므로이 중 하나가 잘못되었습니다.

예제 프로그램 (this mcheck man page의 예제 프로그램 사용)은 MALLOC_CHECK_ = 3 (RHEL 6.4)과 동일한 결과로 MALLOC_CHECK_을 설정하지 않았 음을 보여줍니다. 그리고 mcheck는 독립적으로 설정할 수 있기 때문에 전혀 관련이없는 것처럼 보입니다.

답변

1

네 가지 다른 일관성 검사가 있습니다. 다음은 glibc 2.25에 해당합니다.

  1. 다양한 어설 션. 활성 상태인지 여부는 glibc가 빌드 될 때 결정됩니다. 과거에 데비안과 다운 스트림은 단언을 계속했습니다. 페도라와 다운 스트림은 과거에 이들을 비활성화 시켰습니다 (그러나 현재의 페도라는 그것들을 남겨 둡니다).
  2. 어썰트를 사용하지 않는 코어 malloc 구현의 일관성 검사는 malloc_printerr입니다. 과거에는 MALLOC_CHECK_=0 (및 mallopt)을 사용하여 스위치를 끌 수있었습니다. 그러나 모든 경우에 malloc_printerr 이후의 오류 복구가 올바르지 않으므로 작동하지 않을 수 있습니다. 그리고 힙 손상이 있으면 어쨌든 프로그램이 곧 중단 될 수 있습니다.
  3. 상대적으로 가벼운 힙 버퍼 오버 플로우 감지. 이 값은 MALLOC_CHECK_=3 (또는 다른 0이 아닌 값)에 의해 활성화됩니다. mallopt에 의해 스위치를 켤 수 없습니다. 할당 크기를 늘리고 일부 패딩을 저장하고 일부 위치에서 확인하여 구현됩니다. 이 힙 검사기는 스레드로부터 안전해야하며 malloc 내부와 밀접하게 연결되어 있습니다. 그러나 거의 사용되지 않으므로 쉽게 성가신 버그가 될 수 있습니다.
  4. 과 연결하여 __malloc_initialize_hook에서 호출 한 mcheck 함수입니다. 이는 이전 수표와 완전히 다릅니다. 내 생각은 별도의 메타 데이터 세트 (실제 할당 자와 별도로)를 사용하여 올바른 할당 동작을 확인하는 것이고, mcheck은 malloc 내부 (malloc 후크 제외)에 의존하지 않는다고 생각합니다. 그러나이 훅을 사용하면 스레드 안전이 보장되지 않습니다. 오늘 누군가 mcheck을 사용한다고 생각하지 않습니다. 아무도 아직 제거하지 않았기 때문에 포함되었습니다. (모든 힙 손상이 감지된다는 보장이 없으며 힙을 손상시키는 응용 프로그램은 아직 완전히 정의되어 있지 않으므로 mcheck이 실제로 추가 검사를 수행하는지 여부를 감지 할 수 없습니다.)

이 외에도 MALLOC_PERTURB_이 있으며 초기화되지 않은 데이터 또는 해제 된 데이터에 대한 액세스의 일부 형식을 검색하는 데 사용할 수 있습니다.

0

MALLOC_CHECK_ = N

가변 환경을 설정하는 단계의 glibc 2.3 이후

mallopt (M_CHECK_ACTION, N)를

전화와 동일하다. 4, M_CHECK_ACTION의 기본값 매개 변수는 0

오류 조건을 무시 3.

설정할 수있는 N 에있다; 실행을 계속합니다 (정의되지 않은 결과가 있음).