型の安全性とは? わかりやすく解説

型の安全性

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/05/30 09:44 UTC 版)

型システム」の記事における「型の安全性」の解説

型にまつわるものに限らずプログラム安全性safety)とは、プログラミング言語文脈によって定義が異な場合があり、一概に述べることはできない。ひとつの指標として、プログラム言語仕様定義されていない未定義」の状態に陥らない、という性質のことを指すことがある。たとえばC言語C++標準では、NULLポインタのデリファレンスや、配列範囲外アクセスによるバッファオーバーランなど、そういった未定義」の動作引き起こすケース決められている。大抵の実行環境では、NULLポインタのデリファレンスによってセグメンテーション違反アクセス違反)が引き起こされオペレーティングシステムによってプログラム異常終了させられることになるが、必ずしもそうなるとは限らず実際に何が起こるか分からない。「安全なプログラム記述するためには、言語未定義の動作避けるように注意深くコーディングなければならない。この指標観点では、プログラムエラーを、言語未定義や処理系依存の異常動作によってではなくランタイムインタプリタ検出し仕様通り異常終了するような場合は「安全」の側に含まれることになる。一般的に仮想マシン上で動作するJavaC#のような言語は、ランタイムによって検証され信頼されコードのみを実行する仕組み用意されているため、C/C++よりも安全である。未定義動作コンピュータセキュリティ密接な関係があり、例えバッファオーバーラン引き起こされる悪意のある不正なコード実行できてしまったりするセキュリティホールにつながることがある。ただし安全なチェック機構のある言語ほどオーバーヘッド大きくなるため、安全性実行速度とのトレードオフの関係にある。 例えば、JavaではNullオブジェクト参照した場合実行時NullPointerException例外スローされると言語仕様規定されており、この点でC言語C++よりも安全であると言える。しかし、JavaではNullオブジェクト参照するコード記述して言語構文上は合法みなされるため、コンパイラによるチェック機構働かず実行時NullPointerExceptionスローされるまでプログラミングミスに気づかない可能性がある。さらに進んだKotlinのように「Null安全」な言語では、Nullの状態を許容しない型を定義することができ、このNull許容型を使う限りNullオブジェクト参照することはないことが保証されるまた、Kotlinでは主にJavaとの相互運用のためにNullの状態を許容する型も定義できるが、このNull許容型を使う場合は、事前にNullチェックコードを記述することを言語仕様によって強制されるため、安全性が増す。 そして型にまつわる安全性のことを型安全性(英: type safety)と呼ぶが、一般的に安全性とは、データオブジェクト)の本来の型に従ってプログラム正しく実行できる性質のことを指す。前述のように型安全性具体的にどのようなのであるかはプログラミング言語文脈依存する一般的にコンピュータでは整数浮動小数点数のように異なる型の値同士演算はできず、いったん同じ型に揃えて演算する必要があるプログラマコード上で型変換キャスト)を明示する必要のある厳し言語もあれば、コンパイラによってある程度暗黙型変換や型昇格なされるようなゆるい言語もある。さらにCにおいてはキャスト型変換構文を使うと、互換性のない型同士でも強制変換できてしまう。例え整数ポインタとの間で相互変換することや、整数へのポインタ浮動小数点数へのポインタ無理やり変換することもできてしまい、簡単に安全性破壊される誤った型へのポインタ経由領域アクセスした場合動作未定義である。型検査によって型安全性確保するために、互換性のない型同士変換明示的暗黙問わず一切できないよになっている言語や、間違った型変換をすると実行時例外スローする言語もある。 型安全でない例としては、C/C++において、可変長引数関数利用する場面挙げられる代表的なものprintfscanfで、これらの関数任意の数のあらゆる型のデータオブジェクト)を可変長引数として統一的に渡せるように、いったん引数オブジェクト型情報消去し別途入力として与えられ書式文字列をもとに型情報関数内部復元する仕組みになっている。しかし書式文字列指定ミスがあると、本来のオブジェクト型とは異な誤った型として取り出すことになってしまうが、型が消去されしまっているためにコンパイラミス検出することができない結果として想定されたものとは異なでたらめな値が出力されてしまったり間違った型へのポインタ経由することで誤った領域データ書き込んでしまいクラッシュしたり、といった未定義の異常動作引き起こす一方JavaC#可変長引数では、実引数として渡される個々オブジェクト自身型情報保持しており、書式指定ミスによる型の不一致があった場合例外スローして安全にプログラム中断異常終了させることができるため、C/C++よりも型安全性が高い。 別の例として、ジェネリックプログラミングジェネリクス)をサポートしていなかった初期JavaC#では、可変長動的配列双方向リストなどのコレクションに型Tのオブジェクト格納する場合はいったん基底型であるjava.lang.ObjectやSystem.Objectにアップキャストし、またコレクションからオブジェクト取り出す場合は型Tにダウンキャストなければならず、正しい型のオブジェクトとして取り出すためには注意深くコーディングする必要があった。ジェネリクスサポートすることで、コレクション格納する型Tを静的決めることができるようになり、誤ったキャストにより実行時エラー引き起こす可能性排除できるようになったこのような改善も型安全性の向上みなされる

※この「型の安全性」の解説は、「型システム」の解説の一部です。
「型の安全性」を含む「型システム」の記事については、「型システム」の概要を参照ください。

ウィキペディア小見出し辞書の「型の安全性」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



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

辞書ショートカット

すべての辞書の索引

「型の安全性」の関連用語

型の安全性のお隣キーワード
検索ランキング

   

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



型の安全性のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの型システム (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2024 GRAS Group, Inc.RSS