*BSDでは、最近までphk mallocと呼ばれるmallocが使われていた。
社内ゼミ用に、phk mallocの内部動作の説明を書いたので、公開。
google-code-prettify
2008-09-24
2008-09-11
NetBSD-currentでcannaserverが落ちるのを修正する
NetBSD-currentのバージョンを上げたら、cannaserverが動作しなくなってしまった。
cannaserverのlib/RK/ncache.cに、以下のコードがある。
xはどこかのバッファのアドレスで、このアドレスを元にhashのインデックスを作成しているようだ。
このアドレスが0x80000000以上になるとhash(x)が負になってしまい、誤動作してしまう。
このバグを直すには、
とcastしてやれば良い。
08/09/12追記:
他に困っている人いないのかな?と思って検索してみた。
- Orz日記でも取りあげられていた。
- cvs版では、06/03/30に修正済みだった。(未リリース)
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の比較 - 答え
前回の答え。
これは、helloではなくworldが出力される事もある。
なぜかと言うと…
Cでは、signedの計算でオーバーフローした時の動作は、未定義。
そのためコンパイラは、「signedの計算はオーバーフローしない」と思って最適化をかける事がある。
コンパイラの最適化の結果、
この場合、aは負、bは正なので、worldが出力される事になる。
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
2008-09-01
登録:
投稿 (Atom)