インクリメント 真理値とインクリメント

インクリメント

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/03/17 22:38 UTC 版)

真理値とインクリメント

アセンブリ言語(アセンブラ)や初期のプログラミング言語は、真理値を表す専用のデータ型(ブーリアン型)を持たず、整数型で代用することが多かった。整数で代用する場合、通例0を偽 (false) として扱い、また0以外をすべて真 (true) として扱う。C言語はこの仕様を引きずっており、論理演算の結果は基本整数型intとなる。これはANSI C(C89)以前だけでなく、組み込みのブーリアン型_Boolが追加されたC99以降も変わらない。

このようにブーリアン型として整数型を使用すると、本来インクリメントで記述する必要がない(インクリメントで記述してはいけない)コードにも、誤って使われてしまうことがある。例えば真理値を表すフラグ変数の値を偽から真に変更する場合、通常は変数に何らかの固定値(一般的な代表値としては1)を代入する。しかし、整数型では0をインクリメントすると1になることから、代入ではなくインクリメントでも偽から真に変更することができてしまう。

ソフトウェア工学安全工学の未発達な時代に、不適切なインクリメント命令の使用が致命的なバグを生み、重篤な事故を引き起こした事例として、放射線療法機器のセラック25が挙げられる。セラック25は1985年から1987年にかけて知られる限り6つの重大な被曝事故を引き起こし、少なくとも5人の患者を死亡させた。事故原因には複数の要因があるが、まずセラック25は従来機に搭載されていた電気機械式の安全保護装置(ハードウェア・インターロック)を取り除き、(当時はハードウェア制御よりも安全だと思われていた)ソフトウェア制御に置き換えてしまっていた。装置を制御するコンピュータPDP-11オペレーティングシステム[注釈 3]において、安全性を確保するためのソフトウェア・インターロックのひとつに使われていた、Class3と呼ばれるフラグ変数は、値が0以外の場合、装置に何らかの不一致があり、放射線治療を続行できないことを意味するものだった。セットアップテストのルーチンを通過するたびにClass3変数の値がインクリメントされるコードになっていたが、このClass3変数は1バイト(1オクテット)であり、十進数で0から255までの数値しか表現できない。値が255のときにインクリメントしてしまうと、オーバーフローが発生して0に戻ってしまう。この異常動作はセットアップテストを256回通過するたびに発生する。つまり、本来はフラグが真でなければならない場面で偽となり、障害が正しく検出されないというバグが存在していた[14]。これにより、装置の安全チェックがバイパスされてしまい、患者に過度の放射線が照射され、患者が死亡する可能性があった。当初セラック25のメーカーはこのバグに気づかず、「事故は起こりえない」と回答したことが被害を拡大させた。

なお、Cとは異なり、C++には、ISO規格として標準化される前にリリースされた段階でbool型が存在していた。C++98規格として標準化された時点で、このbool型は値としてfalse (0) あるいはtrue (1) のみをとることが保証されるようになった(とはいえ、すべてのC++実装がこの規格で定められた仕様に正しく準拠していたわけではない)。また、bool型の値をどれだけインクリメントしてもtrueとなるように定められていたが、boolに対するインクリメントはC++98の時点で非推奨となっていた(この仕様決定にセラック25の教訓が反映されていたかどうかは定かではない)。その後、C++17で、インクリメント演算子「++」がbool型に適用できないように規定され、bool型へのインクリメントは正式に削除された[15]

JavaC#のような後発の安全な言語では、ブーリアン型へのインクリメントは登場当初から禁止されている。


注釈

  1. ^ 特にC言語では式としてインラインでの書きやすさゆえにインクリメント演算子が乱用されることがあり、未定義動作や未規定動作を引き起こしやすい[3]
  2. ^ JIS X 3010:2003「プログラム言語C」では「増分演算子」と翻訳されている。
  3. ^ セラック25のソフトウェアはアセンブリ言語で書かれていた[13]

出典



「インクリメント」の続きの解説一覧




固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「インクリメント」の関連用語

インクリメントのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



インクリメントのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのインクリメント (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS