CERT.OOP.CSTD_FUNC_USE

C 標準ライブラリ関数よりも特殊メンバー関数とオーバーロードされた演算子を優先してください。

C 標準ライブラリ関数よりも特殊メンバー関数とオーバーロードされた演算子を優先してください。これらの C 関数には、memset()、memcpy()、memmove()、strcpy()、memcmp()、strcmp() などがあります。これらを C++ の等価機能に置き換えてください。

脆弱性とリスク

一部の C 標準ライブラリ関数は、オブジェクトに対してバイト単位の処理を実行します。たとえば、std::memcmp() は 2 つのオブジェクトのオブジェクト表現を構成するバイトを比較します。std::memcpy() は、オブジェクト表現を構成するバイトを宛先バッファにコピーします。ただし、この結果、一部のオブジェクト型では定義されていない動作や異常なプログラム動作が発生します。

軽減と防止

これらを C++ の等価機能に置き換えてください。たとえば、クラスコンストラクタや operator<()、operator>()、operator==()、operator!=() などのオーバーロードされた演算子を使用する場合などです。

コピー
  #include <cstring>
  #include <iostream>
  
  class C {
    int scalingFactor;
    int otherData;
  
  public
    C() : scalingFactor(1) {}
 
   void set_other_data(int i);
   int f(int i) {
     return i / scalingFactor;
   }
   // ...
 };
 
 void f() {
   C c;
 
   // ...c を変異させるコード ...
 
   // Reinitialize c to its default state
   std::memset(&c, 0, sizeof(C));       //uncompliant code
 
   std::cout << c.f(100) << std::endl;
 }