google-code-prettify

2008-09-24

phk mallocの内部動作の説明

*BSDでは、最近までphk mallocと呼ばれるmallocが使われていた。

社内ゼミ用に、phk mallocの内部動作の説明を書いたので、公開。

2008-09-11

NetBSD-currentでcannaserverが落ちるのを修正する

NetBSD-currentのバージョンを上げたら、cannaserverが動作しなくなってしまった。

cannaserverのlib/RK/ncache.cに、以下のコードがある。
#define hash(x)     ((int)((x)%NCHASH))

xはどこかのバッファのアドレスで、このアドレスを元にhashのインデックスを作成しているようだ。

このアドレスが0x80000000以上になるとhash(x)が負になってしまい、誤動作してしまう。
このバグを直すには、
#define hash(x)     ((int)(((unsigned long)(x))%NCHASH))

とcastしてやれば良い。

08/09/12追記:
他に困っている人いないのかな?と思って検索してみた。
- Orz日記でも取りあげられていた。
- cvs版では、06/03/30に修正済みだった。(未リリース)

2008-09-04

signedの比較 - 答え

前回の答え。

long a = 0x80000000;
long b = 1;

if (a - b > 0) {
printf("hello");
} else {
printf("world");
}

これは、helloではなくworldが出力される事もある。

なぜかと言うと…

Cでは、signedの計算でオーバーフローした時の動作は、未定義。
そのためコンパイラは、「signedの計算はオーバーフローしない」と思って最適化をかける事がある。

コンパイラの最適化の結果、a-b>0が、a>bに変換されると、以下のコードになる。

long a = 0x80000000;
long b = 1;

if (a > b) {
printf("hello");
} else {
printf("world");
}

この場合、aは負、bは正なので、worldが出力される事になる。

2008-09-03

signedの比較

社内で出したクイズ。

以下のコードは、何が出力されるでしょう。longは32bitとした場合。

long a = 0x80000000;
long b = 1;

if (a - b > 0) {
printf("hello");
} else {
printf("world");
}

答えは次回。

2008-09-01

AnkhSVN - visual studioでSubversion

visual studioとsubversionを連携できるAhknSVN

via InfoQ