アカウント名:
パスワード:
`key_data_->label().empty()`に副作用がないなら条件付きか否かで変わらなくない?と思ったが、C++だと&はビット演算で両方trueでもfalseになることがあるのか。&&と&は条件付きかだけじゃなく評価の仕方が違うのね。C#で両辺boolなら無視できるパフォーマンス上の問題でしかないからピンとこなかったわ。
確かに&はビット演算ですが今回の原因はビット演算だからではありません。&&はショートサーキット評価で左の値がfalseのときは右側が実行されませんが、&では左の値に関わらず右が実行されてしまいます。key_data_の定義はbase::Optional<KeyData> key_data_;となっており、base::Optionalというのはstd::optionalのChromium版の実装です。左側では key_data_.has_value() と値が存在しているかどうかをチェックした上で、右側で key_data_->label() とデータにアクセスしていますが、has_value()がfalseならアクセスすべきデータが存在しないのでundefined behaviourとなります。多分nullptrへのアクセスでクラッシュしますね。
unique_ptrとかならnullアクセスになるだろうけど、今回はOptionalだからnullアクセスにはならない。未初期化なデータ領域へのアクセスでのUB。
元コメと同じことを言ってますよ?
> アクセスすべきデータが存在しないのでundefined behaviourとなります。多分nullptrへのアクセスでクラッシュしますね。
UB(undefined behavior)であり、gcc/clang系のreleaseビルドなら大抵 nullptr でしょう。だから”多分”と言ってる。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
吾輩はリファレンスである。名前はまだ無い -- perlの中の人
なんで? (スコア:3, 参考になる)
`key_data_->label().empty()`に副作用がないなら条件付きか否かで変わらなくない?
と思ったが、C++だと&はビット演算で両方trueでもfalseになることがあるのか。
&&と&は条件付きかだけじゃなく評価の仕方が違うのね。
C#で両辺boolなら無視できるパフォーマンス上の問題でしかないからピンとこなかったわ。
Re: (スコア:0)
確かに&はビット演算ですが今回の原因はビット演算だからではありません。
&&はショートサーキット評価で左の値がfalseのときは右側が実行されませんが、&では左の値に関わらず右が実行されてしまいます。
key_data_の定義は
base::Optional<KeyData> key_data_;
となっており、base::Optionalというのはstd::optionalのChromium版の実装です。
左側では key_data_.has_value() と値が存在しているかどうかをチェックした上で、右側で key_data_->label() とデータにアクセスしていますが、has_value()がfalseならアクセスすべきデータが存在しないのでundefined behaviourとなります。多分nullptrへのアクセスでクラッシュしますね。
Re:なんで? (スコア:0)
unique_ptrとかならnullアクセスになるだろうけど、今回はOptionalだからnullアクセスにはならない。
未初期化なデータ領域へのアクセスでのUB。
Re: (スコア:0)
元コメと同じことを言ってますよ?
> アクセスすべきデータが存在しないのでundefined behaviourとなります。多分nullptrへのアクセスでクラッシュしますね。
UB(undefined behavior)であり、gcc/clang系のreleaseビルドなら大抵 nullptr でしょう。だから”多分”と言ってる。