CERT.ERR.CONV.STR_TO_NUM

文字列を数値に変換する際にエラーを検出してください。

istream::operator>>() のような書式付きの入力ストリーム関数を呼び出すときには、変換エラーについての情報が basic_ios::good()、basic_ios::bad()、basic_ios::fail() の継承されたメンバー関数または例外処理 (ストリームオブジェクトで有効になっている場合) を介して照会されます。

脆弱性とリスク

文字列から整数または浮動小数点数を解析するプロセスでは、多数のエラーが発生する可能性があります。たとえば、文字列に数字が含まれていないことがあります。型は正しいが範囲外というデータ (INT_MAX より大きい整数など) が若干含まれることもあります。文字列内の数字の後に追加情報が含まれることもありますが、この情報は変換の後で役立つことも役立たないこともあります。

軽減と防止

変換すれば有効な値になると想定するのではなく、文字列から数値への変換におけるエラー状態を常に明示的に確認してください (または、該当する場合には関連する例外を処理する)。

コピー
  #include <iostream>
  using namespace std;
  void f1() {
    int i, j;
    std::cin >> i >> j;   //uncompliant code
    cin >>i>>j;    //uncompliant code
    // ...
  }
  
 void f2() {
   int i, j;
 
   std::cin.exceptions(std::istream::failbit | std::istream::badbit);
   try {               // Use try catch to process exceptions.It is compliant.
     std::cin >> i >> j;
     // ...
   } catch (std::istream::failure &E) {
     // Handle error
   }
 }
 
 void f3() {
   int i;
   std::cin >> i;
   if (i>0 && std::cin.fail()) {
     // Handle failure to convert the value.It is compliant.
     std::cin.clear();
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
   }
 
   int j;
   std::cin >> j;
   if (cin.fail()) {
     std::cin.clear();
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), ' ');
   }
 
   // ...
 }