2017-09-20 3 views
7

これを行うための公式にサポートされている方法はありませんが。 現在のシステムでは、ポインタがスタックから来たかどうか(たとえば、呼び出し元のスタック)を検出する方法がありますか?メモリがスタックにあるかどうかを検出する方法は? (ヒープまたは静的変数ではない)

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

最初のスタックポインタがわかっていて、スタックサイズがわかっている場合は、現在の変数が範囲内にあるかどうかを簡単に計算できます。簡単な例は、 'int main(void){int firstVar; char * ptrToFirstVar =(char *)&firstVar;/*今度は、スタックの先頭が短くなる*/char * endOfStack = ptrToFirstVar - yourSTACKSIZE; '次に、変数がスタックの開始点とスタックサイズの間にあるかどうかを確認します。 – tilz0R

+0

@ tilz0Rまたはほとんどのプラットフォームは、この情報を照会するためのAPIを提供しています。 –

+0

@AjayBrahmakshatriyaはあなたのコメントのほとんどの部分に注力しています。 – tilz0R

答えて

5

スタックおよびメモリレイアウトはではないので:これは、それはそれを検出することができ構成、例えばのためのエラーを回避でき、実際のコードのロジックの一部として仕事に行くされていない場合でも

Cの標準では、明らかにスタック位置を決定する移植可能な方法はありません。 しかし、オペレーティングシステムによって管理されるシステム用にコンパイルする場合、OSがスタック境界のAPIクエリを提供する可能性があります。それはとして行うことができます。Windowsの

-

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


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

しかし、これは現在のスレッドのスタック境界を与えることに注意して、変数が別のスレッドのスタックの上に位置することができます。その場合は、スレッドハンドルを反復処理し、バインドされた各スタックと比較する必要があります。 ThreadFirstThreadNextを使用できます。

Linuxの場合、/proc/<pid>/mapsファイルを読み、[stack]のエントリを探します。

関連する問題