41030


スタック領域に積んだ値は、関数がネストしてもFrame Pointerから遡って参照することができると理解しているのですが、  
その場合、より深い場所にある値の上書きはできないのでしょうか?

また、できないとすればそれはなぜなのでしょう。  
セキュリティでしょうか?

ただし、代入する値のサイズがもとの値以下であり、Growableでないことを前提とします。

無駄に手書きですが、こういうイメージです

[code]

     ーーーーーーー
    |            |
    |    関数     |
    |            |
    | ローカル変数 <-|
     ----------- | |
    |            | |  上書きしたい
    | ネストした  ---
    |   関数      |
    |            |
     ーーーーーーー 
    
[/code]


CC BY-SA 3.0
2018-01-17T06:35:48.283
41026
2018-01-17T07:55:09.203
2018-01-17T07:39:15.023
27027
27027
question
メモリ管理 assembly memory-leaks スタック
メモリ管理、スタックのmutabilityについて


質問するに至った動機と合致する答えになるのかどうか微妙な気がしますが

[code]

    void func1(int* p) {
        ++p[4];
    }
    void func2(void) {
        int array[10]={0};
        func1(array);
    }
    
[/code]

上記コードはたいていの CPU (x86 も含む) で下記のような動きをします  
\- `func2()` がスタック上に配列 `array` を作成します  
\- `func1()` は自分の使っているスタックより深い階層にある配列 `array` を上書きします  
\- この操作の際にスタックフレームポインタを参照する必要はありません

C++
ラムダ式で自動変数をキャプチャするとか、「関数内関数」ができる言語では、親関数の自動変数を子関数から読み取ったり書き換えたりできます（子関数から見ると、スタック的により深い階層の値にアクセスすることになります）。ラムダ式のキャプチャは結局は参照ですし、アセンブラレベルでの実装上はスタック上のアドレスを扱うだけのことです。


CC BY-SA 3.0
2018-01-17T07:43:39.090
41030
2018-01-17T07:43:39.090
8589
41026
answer


回答になるかわかりませんが、  
1.当該ローカル変数がPUSHされたものである  
2.かつ他の関連する全ての変数のレイアウトとコードが自明。  
なら、当該ローカル変数のアドレスが特定できます(EBPとESPで特定可能)。  
アドレスが特定できれば書き換え可能と言えます。


CC BY-SA 3.0
2018-01-17T07:55:09.203
41033
2018-01-17T07:55:09.203
3793
41026
answer