アカウント名:
パスワード:
実装なのか想像するスレ
昨日twitter上でいろいろと話していました。えーっと…1. memcmp は、通常、差異がある場合は先頭バイトの差を返す(-255~255)2. ところが SIMD 命令などで memcmp が最適化された場合、char の範囲外(int範囲とか)になってしまう可能性がある。3. その戻り値を char にキャストしているため、場合によっては下位 8bit が 0 になって、一致してしまう。てなことらしい。たぶん。
先頭バイト値の差だとしても、既にchar型の範囲外だね。char型は-128〜127
というより、関数の戻り値がintなのにcharにキャストしてしまっている時点で、ただのバグだね。SSE最適化とかは本質的には関係ないな。
自己レス失礼。理解した。-255〜255だと、元が0でなきゃchar型にキャストしても0にならない範囲内なのね。これは確かにうっかりしそうだ。
それでも縮小キャストしてる時点で終わってますが。
しかもその理由が「コンパイラが警告を出すから」だったりするし。
ナローキャストしないと警告を出すなんて!?と思ったが、こういうことだな。
char型を返す関数内でmemcpy関数の戻り値を引き回した。intからcharへの暗黙のナローキャストが発生しているので、コンパイラが警告を出した。明示的にキャストを追加したら警告が出なくなった。(明示的なキャストは「わかっててやってる」はずのものなので)幸せになったつもりが、不幸せになっていた。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
人生unstable -- あるハッカー
どういう (スコア:0)
実装なのか想像するスレ
Re: (スコア:5, 参考になる)
昨日twitter上でいろいろと話していました。えーっと…
1. memcmp は、通常、差異がある場合は先頭バイトの差を返す(-255~255)
2. ところが SIMD 命令などで memcmp が最適化された場合、char の範囲外(int範囲とか)になってしまう可能性がある。
3. その戻り値を char にキャストしているため、場合によっては下位 8bit が 0 になって、一致してしまう。
てなことらしい。たぶん。
Re: (スコア:1)
先頭バイト値の差だとしても、既にchar型の範囲外だね。char型は-128〜127
というより、関数の戻り値がintなのにcharにキャストしてしまっている時点で、ただのバグだね。
SSE最適化とかは本質的には関係ないな。
Re: (スコア:1)
自己レス失礼。
理解した。
-255〜255だと、元が0でなきゃchar型にキャストしても0にならない範囲内なのね。
これは確かにうっかりしそうだ。
それでも縮小キャストしてる時点で終わってますが。
Re: (スコア:0)
しかもその理由が「コンパイラが警告を出すから」だったりするし。
Re:どういう (スコア:0)
ナローキャストしないと警告を出すなんて!?
と思ったが、こういうことだな。
char型を返す関数内でmemcpy関数の戻り値を引き回した。
intからcharへの暗黙のナローキャストが発生しているので、コンパイラが警告を出した。
明示的にキャストを追加したら警告が出なくなった。(明示的なキャストは「わかっててやってる」はずのものなので)
幸せになったつもりが、不幸せになっていた。