string 長の計算が非効率的です
std::basic_string::length() を使用する代わりに std::basic_string::c_str() からの戻り値に対して文字列長関数を使用することによって文字列長が計算される
説明
この欠陥は、std::basic_string 文字列の長さが、メソッド std::basic_string::length() を使用する代わりに std::basic_string::c_str() から返されたポインターに対して文字列長関数を使用することによって計算された場合に発生します。
チェッカーは、strlen、wcslen、char_traits::length などの文字列長関数にフラグを設定します。
リスク
std::basic_string::c_str() は、文字列に保存されたデータと同じデータが保存される null で終了する文字配列へのポインターを返します。この文字配列に対して strlen などの文字列長関数を使用すると、文字列長が返されることが期待されます。このアプローチは、一見すると、文字列長に対する std::basic_string::length() メソッドの使用に相当するものに見えます。
ただし、関数 strlen(str) は線形複雑度 O(N) の関数です。ここで、N は文字列 str の長さです。str が std::basic_string 型の場合は、std::basic_string::length() メソッドを呼び出すと、より効率的に (複雑度 O(1) を使用) 長さが返されるため、この複雑度は必要ありません。
修正方法
文字列が std::basic_string 型の場合は、strlen などの文字列長関数を使用する代わりに文字列長を取得するために、次のようにします。
std::string s; auto len = strlen(s.ctr());
std::basic_string::length() を使用します。std::string s; auto len = s.length();
パフォーマンスの改善の程度は、使用しているコンパイラ、ライブラリ実装、環境によって異なる可能性があります。
結果情報
| グループ: パフォーマンス |
| 言語: C++ |
| 既定値: オフ |
コマンド ライン構文: INEFFICIENT_BASIC_STRING_LENGTH |
| 影響度: Medium |
バージョン履歴
R2020a で導入