|
|
||
| << | 2012/04 | >> | ||||
| 日 | 月 | 火 | 水 | 木 | 金 | 土 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | |||||
| サイト本体 | 昔の更新履歴兼雑記 | タイトル一覧 |
分類は アーカイブ任せにした方がいいのかも。
という問題を id:ranha さんに教えてもらいました。色々考えてて、標準ライブラリ使っちゃうと errno 使うとか、状態持つ関数 (strtok とか sbrk とか、あげくの果てには getenv/setenv) 使うとかで、割と簡単にできてしまうように思ったので、出力以外の関数は封印しないといけないな…と思いました。
あとはスタックへの代入の書き込みも割と自明になっちゃうんで当然禁止。
で、あれこれとややこしいことを考えてたんですが、これでできることに気付いて拍子抜けしました…
x86-64 でも7個目の引数から stack に置かれるのを知っていれば別に難しくない。
#include <stdio.h> int f() { if (4[(int*)__builtin_frame_address(0)]) return (f(0,0,0,0,0,0,4[(int*)__builtin_frame_address(0)] - 1) + 4[(int*)__builtin_frame_address(0)]); return 0; } int main() { printf("%d\n", f(0,0,0,0,0,0,100)); return 0; }
これはどうも引数を渡すのも禁止する必要がありそうですね。そのしばりを入れてもできるような気がしてるのですが、これはなかなか難しい…
ちなみに元ネタは変数をひとつしか使わない、というものだったそうです。