__builtinin_frame_address()を使用しました。
typedef struct layout{ void *n; void *ret; }layout; void func(){ layout *rbp = __builtin_frame_address(0); void *p = __builtin_frame_address(0); printf("%p, %p, %p\n", rbp->ret, rbp->n, p); } int main(){ void (*pp)() = func; pp(); printf("%p\n", pp); return 0; }
結果は、、、
0x555555554708, 0x7fffffffd5b0, 0x7fffffffd590
0x5555555546b0
となりました。
この関数はフレームポインタを返します。
*layout rbp = __builtin_frame_address(0);
普通ならこの行でWarningが出てきますが、ビルトイン関数の場合ではでてきません。
なぜです??
この場合、**rbp->n = __builtin_frame_address(0);**と同義でしょうか?
#include<stdio.h> typedef struct lay{ int *p; int *t; }layout; int main(){ int re = 10; layout *p = &re; printf("%p, %p, %p\n", &re, p->p, p->t); }
こちらはWarningが出現します。
0x7fffffffd594, 0xffffd5940000000a, 0x5555470000007fff
となります。
見てもわかりますが、値がずれています。
p->t には何も入れていませんがなにやらアドレスのようなものが出現しています。
なんですか?これは・・・
(__builtin_frame_address()の時もですね。)
どちらの場合も、ポインタのポインタとなっているのかな・・・?と思いますが
入れてもいないメンバ変数になんでアドレスが入っているのでしょうか?
アセンブリ言語で見ると・・・
mov %rsp %rbp をしたあとのスタックフレームを取得しているようです。
なので、
rbp->n = %rbp = %rsp という関係かと思います。
その前に、push %rbpがあるので、rbp->n はそのスタックのアドレスが入っているわけですよね。
その前は、call命令により関数のリターンアドレスが入っています。
linux 64bit Debian系 gccです。
どなたか教えてもらいないでしょうか??
ちなみに・・・
*p には rbp->nと同じ値が格納されていました。
???
rbp->nとpが同じ結果になっていない理由がわかりません。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/22 11:19
2017/07/22 11:23
2017/07/23 12:07
2017/07/23 12:10
2017/07/23 12:11
2017/07/23 12:11
2017/07/23 12:14