kagamihogeの日記

kagamihogeの日記です。

warning には意味がある - 2

先のエントリの続き的な内容。今回は動作不良ではなく、C の懐の深さを垣間見ることになりました。

とりあえずコード。

int aresore1(int *foo, int *var) {...}
int aresore2(int *foo, int *var) {...}

先に書いたエントリのコードの特徴(関連する関数をまとめた・大抵の関数は同数の引数)を持つコードが再度現れたので身構えました。しかし、シグネチャはぜんぶポインタ型。念のためこれらを使ってるコードを見てみると

int main_aresore() {
int foo;
int var;

foo = get_foo();
var = get_var();

aresore1(foo, var);
}

引数の型は int * だけど使う側は int になっている。しかし、動作におかしいところもなく正常に動いている。何が起こってるんだ?と思ったけど事は簡単だった。
たぶん、C に慣れてる人なら予想付くかもしれませんが。

再び呼び出される側のコード。処理内容はホントは別のことやってるけど、単純化のため足し算にしてます。

int aresore1(int *foo, int *var) {
int _foo = foo;
int _var = var;
int sum = 0;
sum = _foo + _var;
....
}

aresore1(100, 200) とか呼び出すと sum は 300 になる。へー C ってこういうコードでも(warining は出るけど)動作しちゃうんだぁ・・・と妙なところに感心しかけて

駄目だこいつ・・・早くなんとかしないと・・・と苦悩するライトの絵が頭に浮かんだ。

int * として宣言してはいるけど int として使っている。これは・・・確かに、一応は動く。まぁ・・・そのうち aresore1 側がそういう動作する、ってことを知らない人がこの aresore1 使ったりメンテすることになったら爆死する可能性があるけど。

でまぁ、こんな感じの warning 吐きまくりなコードがまだまだ大量に眠ってる。けど動いてる。・・・すごい怖いんですけど・・・。

資質ある方々よ、私はどうすれば・・・。