2016-04-16 32 views
1

私は大学図書(私は本の主題はLinuxプログラミングです)からいくつかのCコードを勉強していました。私は理解できないコード行をいくつか見つけました。私はいくつかの調査をしましたが、私はインターネット上で何も見つけられませんでした。誰かがこのコードを私に説明することはできますか?この機能割り当てはどのように機能しますか?

どのような環境変数があるのか​​分かりませんが、わからない部分はこのint (*det)(), det()の機能がどのように機能するかです。申し訳ありませんが、私のタイトルが正しくない場合、私はちょうど被験者をより良く表現する方法を知らなかった。

#include<stdio.h> 

int main(){ 
    int (*det)(); 
    det = getenv("foo");  
    det(); 
    return 0; 
} 

***は「ハロー」の例のプリントのために、そこにあなたのreplies.isのためにこのプログラムを機能させるためにどのような方法をありがとう!

+1

ベストトロールここでは、今週読んだことがあります。 –

+0

'stidio.h'、真剣に? –

+0

検索するキーワードは「関数ポインタ」 –

答えて

1

det = getenv("foo"); 

はあまり意味がないと私はあなたのコンパイラが十分にスマートであると思いますので、 あなたはあなたに期待していた何であるかもしれない離れit.Belowで取得しないことその本を参照してください:

#include <stdio.h> 
#include <stdlib.h> 

extern char* getenv(const char*); 
/* The above statement is not mandatory but would make the code more 
* readable. The keyword "extern" here implies that the function is 
* is defined elsewhere. 
*/ 

int main(void) 
{ 
    char* (*det)(const char*) = getenv; 
    printf("PATH env variable contains : %s\n", (*det)("PATH")); 
    /* Replace path with your own environment variable */ 
    printf("Press any key to continue..\n"); 
    getchar(); 
    return 0; 
} 

私はちょうどここにいくつかのものを印刷しています、あなたのニーズを満たすために使用を変更します。ここ

参照

getenv()プロトタイプ。

5

一般に、動作しません。関数ポインタにchar*(文字列)を代入しようとしています。合理的なコンパイラがこれを拒否します。

ただし、すべてのコンパイラが妥当であるとは限りません。このコードをコンパイルして実行すると、環境変数fooによって攻撃の脆弱なプログラムが作成されています。これは、fooの内容を実行して、実際にマシン上で実行可能であれば、Cプログラムからの制御を、fooにあるコードにシフトさせるためです。これは移植性がなく、おそらく非作業であり、確実に危険であり、決して試みるべきではありません。

また、あなたが得た本は、情報セキュリティに関するものです。もしそうでなければ、それを燃やしてください。誰かがすでに指摘したように

関連する問題