Googleが公開したChrome OS向けアップデート「91.0.4472.165」にはユーザーのログインができなくなるという問題がありました。Googleはアップデート公開から1日以内に問題に対応するアップデート(91.0.4472.167)を公開しましたが、驚愕の不具合発生理由を知ったユーザーは怒りを抑えられないようです。
- UPDATE: It seems Google has pulled the .165 stable release. It should now be safe to proceed as normal. IF YOU WERE AFFECTED, READ BELOW. : chromeos
- Google pushed a one-character typo to production, bricking Chrome OS devices | Ars Technica
- Google messed up all those Chromebooks yesterday because of a single typo
Chrome OSはオープンソースで作られているため、今回の91.0.47.165のアップデートで適用されたソースコードの変更内容を確認することができます。Chrome OSのログイン不可問題発生後、海外の掲示板サイトRedditのユーザーであるelitist_ferret氏がどこに問題があるかを見つけることに成功しました。
elitist_ferret氏によると「Googleは『ユーザーの暗号化キーを保持する処理を行う』Cryptohome VarultKeysetの条件分岐文(if文)で1文字のタイプミスをしている」ようで、Google側の極めて単純なミスで問題が発生したとのこと。該当する処理は「2つの条件が一致したら次の処理を行う」というものですが、if文の条件分岐には「&」の記述が1文字足りなかったことで「条件が一切成立せず」次の処理に移動することができなくなっていました。
▼誤り
if (key_data_.has_value() & !key_data_->label().empty()) {
return key_data_->label();
}
▼本来あるべき記述
if (key_data_.has_value() && !key_data_->label().empty()) {
return key_data_->label();
}
該当のプログラムはC++で記述されており、今回のif文の条件分岐で本来使用されるべき「&&」(論理演算のAND)は「&&の左右にある条件が両方成立したらif文の中({}内)にある処理を実行」を意味します。「&」の場合はビット演算のANDとなります。後者のANDを今回のif文で使用する場合は両方の条件がTrue(真)となったら、次の処理に移動するという意味になり、基本的には同一の意味合いとなるので、どちらの書き方でも問題なく機能するケースがあります。
しかし、&&の場合は「左側の式がFalseとなったら、右側の式が検証されない」のに対して、&の場合は常に両方の式が検証されるという機能的な違いがあります。今回のソースコードでは左側がFalseと判定された場合、右側の記述ではNullポインタの例外が発生するようで、「&」を使用すると、処理として成立しないという問題があるようです。
この事実を知ったユーザーは「Googleは何のテストをしてOKと判断したのか」「なぜベータ版の時点で無視されて一般ユーザー向けの安定版リリースにこぎつけたのか」といった意見が続出。Googleの品質管理体制が大きく問われるような問題とされそうです。
以前はAppleでも似たような問題で、HTTPS接続関連のとんでもない不具合が長期間修正されていなかった問題がありましたが、今回を機にGoogleには品質管理をちゃんと見直してほしいと思います。