2008-12-31

http://anond.hatelabo.jp/20081231183502

関数ポインタバッドノウハウどころか、手続き的な抽象を使いたいところで多用しますぜ。超重要。 そして関数型プログラミング言語存在意義みたいなもん。

C++オブジェクト指向言語だと 継承と仮想関数を使うけど、同じようなケースで C言語では関数ポインタを使うんすよ。

先にもかいたけど、ソートの比較関数とか、スレッドの開始とか、コールバックとか。

で、変数ポインタ関数ポインタ曖昧性(?) の件は、 私は重箱の隅をつつき過ぎたが…

要するに、 (例えば) x86機械語に対応するデータを生成して、その先頭アドレス関数ポインタにぶち込んで実行するという手法。

  1. 過去は動的ロードのための手法として使われた
  2. 生成される機械語コードの難読化や、xbyakとかで出来るような最適化もあり (コード上の定数を書き換えたり)
  3. ウィルスで使われてる手法のひとつ。 振る舞いは見た目バグっぽくもある。 ので 実行時に OSCPUアンチウィルスはこの機能に対して保護機能を働かせる場合も
  4. こんなこと普通はしないから コンパイラやツールは そういう変なキャストを見つけると バグとして警告を出す
  5. 人工知能的なプログラミングにも使えるかも?

1. は、もう使われてない。 2. みたいな利点はある。3.4.みたいな例があるために現在では扱いづらいかも? 5. みたいな使い方がしたければ…悪い事は言わない、evalがあるRubyPythonLispSchemeあたりを使っとけ。 って感じっす

# またトラバ先を間違えた。

記事への反応 -
  • その辺のメモリポインタと関数ポインタのあいまいさがCのポインタの面白いところだと思うよ? よくわからんが何が曖昧なんだろう。 区別されているでしょ。 クラックされるから関...

    • ×クラックされるから関数ポインタを使わない ○メモリ上にプログラムを自力でロードして、それを関数ポインタに変換して関数コールすると、Exploit系のバグなのか、わざとやっている...

      • Exploit系のバグなのか、わざとやっているのかが外部ツールで判別付かない場合がある ツールにひっかかるから、ですらないと思う。単にそういう技が必要なくなっただけ。 そもそもexp...

        • 単にそういう技が必要なくなっただけ 必要が無くなったのは大前提だと思うけど? だから、昔はやったけど、今はやらない。DLLやSOがあるというのが1番の理由。でも、なんでDLLやSOが...

          • あきらかに素人さん相手の説明でそりゃーないでしょ。というか、第1の問題点として指摘しているかのように書いてあるし。まぁいいけど。。。 そもそも、まさに動的リンク機能がOSに...

            • 関数ポインタはバッドノウハウどころか、手続き的な抽象を使いたいところで多用しますぜ。 C++やオブジェクト指向言語だと 継承と仮想関数を使うけど、同じようなケースで C言語では...

              • そういうのはバッドノウハウとは言わないの?(「本来想定されていない使い方をするために、工夫してできるようにしちゃうノウハウ」を指してバッドノウハウと言うんだと思ってたか...

                • そういうのはバッドノウハウとは言わないの? 関数ポインタをバッドノウハウとは言わないでしょ。C言語自体がバッドノウハウと言うなら、当たりだけど:) 手続きという抽象はまこと...

                  • 関数ポインタで、例示された5つを実現するのはバッドノウハウじゃないの? 「関数ポインタを使ってプログラミングしましょう」というプログラミングスタイルは、正統派ではないと...

                    • 例示された 5つ が 動的コード操作のことを指しているのなら、そりゃバッドノウハウかもね。 でも関数ポインタは… 「関数ポインタを使ってプログラミングしましょう」というプロ...

                      • うーん。 K&Rでも「5.11関数へのポインタ」で触れられてるのはqsortの話だし、そこで「関数へのポインタを定義できるよ」とはある。個人的にこれは意図していないけど載ってることだ...

                      • 関数ポインタはバッドノウハウになっているよ、確かに。 じゃぁ、何がグッドノウハウかというとC++のVirtual関数 C++の継承やVirtual関数は中身はvtableでvtableって何のこと?っていうと 関数...

                        • 関数ポインタがバッドノウハウ的であるような根拠があれば納得できるんだけど。 オブジェクト指向だってバッドノウハウじゃない?ツリーの途中で指摘されてなかった? 昨日からお前...

            • 最初期の増田っす。 そもそも関数ポインタって、最近流行の言葉(笑)で言えばバッドノウハウだから、別に細かいこと良いんじゃないの? 関数呼び出しってのも「式」にしちゃうとコン...

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん