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

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

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

悪ふざけで書いた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のほうがマシ(何がマシか謎)な感じです。

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