private配列の直接返却

private配列の直接返却

説明

公開メソッドが内部のprivateリストや配列をそのまま返すと、呼び出し元は返された参照を通じてオブジェクトの内部状態を直接変更できます。

想定される影響

  • 外部のコードが権限リスト、ポリシーリスト、検証済みの値を変更する可能性があります。
  • オブジェクトが維持すべき条件を回避できるおそれがあります。

対処方法

  • Pythonのリストはスライス、list()、copy()などでコピーして返してください。NumPy配列の基本スライスはビューを作るため、独立したデータが必要なら配列のcopy()メソッドを使ってください。
  • 呼び出し元での変更が不要なら、タプルなどの不変型で値を公開してください。浅いコピーやタプルでも変更可能な要素は共有されるため、要素まで保護する必要があるか確認してください。

例

要素自体を別途コピーする必要がないPythonリストを前提とした抜粋です。

変更前

python
def get_values(self):
    return self.__values

変更後

python
def get_values(self):
    return self.__values[:]

説明:

  • 変更前: 内部のprivateリストや配列をそのまま返すため、呼び出し元は参照を通じて内部状態を変更できます。
  • 変更後: リストを浅くコピーして返し、返されたリストでの追加・削除・要素の置き換えが内部リストへ直接反映されないようにします。

参考資料