2017-09-20 148 views
7

Bunu yapmak için resmi olarak desteklenen bir yol yokken. Bir işaretçinin yığından olup olmadığını (örneğin arayanın yığını) algılamak için (modern sistemlerde) bir yol var mı?Bellek yığında olup olmadığını nasıl algılar? (yığın veya statik değişken değil)

gerçek kod mantığının bir parçası olarak çalışmaya gitmiyor bu, onu algılayabilir yapılandırmaları için, örneğin hataları önlemeye yardımcı olabilir bile: yığını ve bellek düzeni içinde olmadığından

void my_function(void *arg) { 
    /* Only some configurations can do this (depending on compiler & arch). */ 
#if THE_MOONS_ALIGN 
    assert(not_stack_memory(arg)); 
#endif 

    /* ... actual logic ... */ 
} 
+4

, başlangıçtaki yığın işaretçisi biliyor ve yığın boyutunu biliyorsanız şimdiki değişken aralığında ise, o zaman kolayca hesaplayabilir. Basit örnek, int main (void) {int firstVar; char * ptrToFirstVar = (char *) & firstVar;/* Artık stack */char * endOfStack = ptrToFirstVar - yourSTACKSIZE; 'un kısa bir başlangıcına sahipsiniz. Sonra değişkeninizin yığın ve yığın boyutu arasında olup olmadığını kontrol edin. – tilz0R

+0

@ tilz0R veya çoğu platform bu bilgiyi sorgulamak için API'ler sağlar. –

+0

@AjayBrahmakshatriya, * yorumunuzun çoğuna * odaklanır. – tilz0R

cevap

5

C standardı, yığın pozisyonlarını belirlemek için açık bir şekilde taşınabilir bir yol yoktur. Bununla birlikte, bir işletim sistemi tarafından yönetilen bir sistem için derleme yapıyorsanız, işletim sisteminin bir API sorgusu yığın sınırları sağlaması için iyi bir şans vardır. o kadar yapılabilir Windows'ta

-

#include <windows.h> 
struct _TEB { 
     NT_TIB NtTib; 
}; 


void *getStackBase(){ 
     return NtCurrentTeb()->NtTib.StackBase; 
} 
void *getStackLimit(){ 
     return NtCurrentTeb()->NtTib.StackLimit; 
} 

Ama bu mevcut parçacığı yığın sınırları verecektir unutmayın, değişken başka parçacığının yığın üzerinde yer olabilir. Bu durumda, iş parçacığı tutamaçlarının üzerinde yineleme yapmanız ve her bir yığınla karşılaştırmanız gerekir. Bunun için ThreadFirst ve ThreadNext'u kullanabilirsiniz.

Linux üzerinde /proc/<pid>/maps dosyayı okuyabilir ve [stack] girdi arayın.