このブログの更新は X(旧Twitter)アカウント @m_hiyama で通知されます。
Follow @m_hiyama

ご連絡は上記 X アカウントに DM にてお願いします。

参照用 記事

もっとえぐいトリックはないものか?

悪ふざけで書いたCコードです。ハードウェアとコンパイラにすごく依存します。IA-32のCPUとgccでやっています。[追記]注意事項があります → Cで、関数の引数を後始末するのは呼び側だったよね[/追記]



/* countdown.c */

void countdown(int *);
void mark(int);

main(int argc)
{
int c = 10;
mark(0);
printf(" %2d\n", c);
countdown(&argc);
}

unsigned _mark;

void mark(int arg)
{
_mark = *((unsigned *)(&arg - 1));
}

void countdown(int *pargc)
{
unsigned *p = (unsigned *)(&pargc - 1); // IA-32 + gcc
*p = _mark;

int *pc = pargc - 3;
if (*pc <= 0) {
printf(" BANG!\n");
exit(0);
}
(*pc)--;
}

関数markを使って戻り番地を記録しているところがどうもイマイチ感があります。最初は、mainの入り口からのオフセットを勘定した定数を使おうと思っていたのですが、それよりはmarkのほうがマシ(何がマシか謎)な感じです。

ともかく、僕はこれ以上思いつかないのですが、なんか「ウヒョー」という感じのトリックはないものでしょうか?