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(), ' ');
}
// ...
}