メインコンテンツ

AUTOSAR C++14 Rule A18-0-2

The error state of a conversion from string to a numeric value shall be checked

説明

ルール定義

文字列から数値への変換のエラー状態をチェックするものとします。

根拠

文字列から数値への変換によってエラー状態が発生する可能性があります。たとえば次のような入力文字列の場合です。

  • 数値が含まれていない

  • 数値は含まれるが、範囲外の数値である

  • 数値の後にデータが続いている

atoi() などの C 標準ライブラリ関数を使用する場合、先行する入力にエラーがあると、未定義の動作が発生する可能性があります。未定義の動作と検出されないエラーを回避するには、文字列から数値への変換時に出力のエラー状態をチェックします。C 標準ライブラリ関数の使用は避けてください。代わりに std::stoi()std::stof()std::stol() などの C++ 標準ライブラリ関数を使用します。

Polyspace 実装

Polyspace® は、文字列を数値に変換する C 標準ライブラリ関数 atoi()atol()、および atof() にフラグを設定します。

トラブルシューティング

ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <cstdlib> 
#include <iostream> 
#include <string> 

void foo() { 
	std::string str1 = "7"; 
	std::string str2 = "3.1415"; 
	std::string str3 = "three"; 

	int myint1 = std::stoi(str1); //Compliant 
	float myint2 = std::stof(str2); //Compliant 
	long myint3 = std::stol(str3); //Compliant 

	const char* str4 = "12"; 
	const char* str5 = "2.7182"; 
	const char* str6 = "undefinedError"; 

	int num4 = atoi(str4); //Noncompliant 
	float num5 = atof(str5); //Noncompliant 
	long num6 = atol(str6); //Noncompliant  
	//...
} 

この例では、Polyspace は、文字列を数値に変換する C 標準ライブラリ関数の使用にフラグを設定します。次に例を示します。

  • 文字列を数値に変換する C 標準ライブラリ関数 (atoi()atof()atol() など) は、無効な変換によって未定義の動作が発生するため、非準拠としてフラグが設定されます。

  • 文字列を数値に変換する C++ 標準ライブラリ関数 (std::stoi()std::stof()std::stol() など) には、フラグが設定されません。無効な変換によって生成される std::invalid_argument 例外は、定義済みの動作であるためです。

チェック情報

グループ: 言語サポート ライブラリ
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入