2014年12月17日水曜日

入社二年目のプログラムをなおしてみた。

日本の最高学府の大学院を卒業後、とある会社に入社した二年目の社員が、なぜプログラムが落ちるのかわからなくて悩んでいる。しかももう一ヶ月も。

やっぱ、企業ってお金稼ぐことも大切ですが、雇用の安定とか社会的な責任を果たすことも大事ですからね。

わかりやすくするためにコードを簡単にするとこんな感じ。

#include <stdio.h>
void func(int* a){
*a=12345;
}
int main(int argc,char* argv[])
{
int a;
func((int*)a);
printf("a=%d\n",(int)a);
return 0;
}

うーん、これはとっても難しい問題だね。
なのでどうすれば動くのか一緒に考えてみました。


案その1:

グローバルなint*をオペレーターを定義できないかなぁ

operator int*(int a){
 return &a;
}

文法上キャストのグローバルオペレータは定義できなかった気が・・・。



案その2:

変数aに自分自身のアドレスを入れる。

void func(int* a){
*a=12345;
}
int main(int argc,char* argv[])
{
int a=(int)&a;
func((int*)a);
printf("a=%d\n",(int)a);
return 0;
}

一応androidだと動くけれど、iphone5Sとiphone6だとたぶん動かない。


案その3:

変数aをintptr_tにする。

void func(int* a){
*a=12345;
}
int main(int argc,char* argv[])
{
intptr_t a=(intptr_t)&a;
func((int*)a);
printf("a=%d\n",(int)a);
return 0;
}

これで大体どんな環境でも動くじゃん。
64ビットのBIGエンディアンとかは動かない気もする。
ということはstrict aliasingルールに反する気も。
やっぱ、どうしてもあそこに&をつけたいけれど、女性とあの行だけは決して手をだしていけない。&をつけてはいけないにルール変更。


案その4:

void func(intptr_t* a){
*a=12345;
}
int main(int argc,char* argv[])
{
intptr_t a=(intptr_t)&a;
func((intptr_t*)a);
printf("a=%d\n",(int)a);
return 0;
}


やったーやっとこれできちんと動く。
やっぱり、どんな環境でもきちんと動くってとっても難しいです。

0 件のコメント:

コメントを投稿