JPCERT コーディネーションセンター

EXP00-J. メソッドの返り値を無視しない

EXP00-J. メソッドの返り値を無視しない

メソッドは、処理の失敗や成功を通知したりローカルオブジェクトやフィールドを更新するために、値を返すことができる。メソッドの返り値が無視されたり、呼出し元が適切な処理を行わない場合には、セキュリティ上のリスクが生じる。よって、プログラムはメソッドの返り値を無視してはならない。

ゲッターメソッドがその動作に基づいて命名されている場合、プログラマは、返り値があることに気がつかないかもしれない。たとえば、ProcessBuilder.redirectErrorStream() メソッドの唯一の目的は、ProcessBuilder が標準エラーと標準出力のマージに成功したかどうかを返り値によって報告することである。標準エラーのリダイレクトを実際に行うメソッドは、オーバーロードされた引数1つの ProcessBuilder.redirectErrorStream(boolean) メソッドである。

違反コード (ファイル削除)

以下の違反コード例はファイルを削除しようとしているが、削除に成功したかどうかをチェックしていない。

public void deleteFile(){

  File someFile = new File("someFileName.txt");
  // someFile を使った処理
  someFile.delete();

}
適合コード

以下の適合コードは、delete() メソッドが返す Boolean 値をチェックし、エラーに対処している。

public void deleteFile(){

  File someFile = new File("someFileName.txt");
  // someFile を使った処理
  if (!someFile.delete()) {
    // ファイル削除に失敗したときの処理
  }

}
違反コード (文字列の置換)

以下の違反コードは、String.replace() メソッドの返り値を無視しており、元の文字列の更新に失敗している。String オブジェクトは不変(immutable)であるため、String.replace() メソッドは String の状態を変更することができない。そのため、変更を加えた文字列を含む新しい String オブジェクトへの参照を返り値として返す。

public class Replace {
  public static void main(String[] args) {
    String original = "insecure";
    original.replace('i', '9');
    System.out.println(original);
  }
}

不変オブジェクトのメソッドの返り値を適切に処理することは特に重要である。可変(mutable)オブジェクトのメソッドの多くはオブジェクトの内部状態を変更しつつ動作するが、不変オブジェクトのメソッドはオブジェクト(の内部状態)を変更できないので、多くの場合、元のオブジェクトをそのままにして、変更を加えたオブジェクトへの参照を新たに生成して返す。

適合コード

以下の適合コードでは String オブジェクト originalString.replace() メソッドの返り値を使って適切に更新している。

public class Replace {
  public static void main(String[] args) {
    String original = "insecure";
    original = original.replace('i', '9');
    System.out.println(original);
  }
}
リスク評価

メソッドの返り値を無視するとプログラムの予期せぬ動作につながる可能性がある。

ルール

深刻度

可能性

自動検出

自動修正

優先度

レベル

EXP00-J

不可

P8

L2

自動検出
ツール バージョン チェッカー 説明
CodeSonar 9.0p0

JAVA.NULL.RET.UNCHECKED
JAVA.FUNCS.IRV

Call Might Return Null (Java)
Ignored Return Value (Java)

Coverity 7.5 CHECKED_RETURN Implemented
Klocwork

2025.2

RI.IGNOREDCALL
RR.IGNORED

Parasoft Jtest 2024.2 CERT.EXP00.NASSIG
CERT.EXP00.AECB
Ensure method and constructor return values are used
Avoid "try", "catch" and "finally" blocks with empty bodies
PVS-Studio

7.38

V6010, V6101
SonarQube 9.9

S2201

S899

Return values from functions without side effects should not be ignored

Return values should not be ignored when they contain the operation status code

SpotBugs

4.6.0

RV_RETURN_VALUE_IGNORED
RV_RETURN_VALUE_IGNORED_INFERRED
RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT
RV_RETURN_VALUE_IGNORED_BAD_PRACTICE
RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED
RR_NOT_CHECKED
SR_NOT_CHECKED

Implemented
関連ガイドライン

SEI CERT C コーディングスタンダード

EXP12-C. 関数の返り値を無視しない

SEI CERT C++ Coding Standard

VOID EXP12-CPP. Do not ignore values returned by functions or methods

ISO/IEC TR 24772:2010

Passing Parameters and Return Values [CSJ]

MITRE CWE

CWE-252, Unchecked Return Value

参考文献

[API 2006]

method delete()
method replace()

[Green 2008]

String.replace

[Pugh 2009]

Misusing putIfAbsent

[Seacord 2015] Image result for video icon EXP00-J. Do not ignore values returned by methods LiveLesson
翻訳元

これは以下のページを翻訳したものです。

EXP00-J. Do not ignore values returned by methods (revision 134)

Top へ

Topへ
最新情報(RSSメーリングリストTwitter