メインコンテンツ

禁止された関数の使用

禁止された関数のブロックリストに追加されている関数の使用

説明

この欠陥は、禁止された関数のブロックリストに追加されている関数を使用した場合に発生します。ブロックリストを作成するには、次のようにします。

リスク

関数は、以下のいずれかの理由でブロックリストに追加されます。

  • その関数により動作が未定義のさまざまな状況が発生し、セキュリティの脆弱性につながる可能性があり、より安全な別の関数が存在している。

    [危険な標準関数を使用しています][旧式の標準関数が使用されています] などの既存のチェッカーによって明示的にチェックされない関数を禁止できます。

  • 関数が、C++98 から C++11 へなどの移行の一環として非推奨になっている。

    移行の一環として、置き換える必要がある関数のリストを作成し、このチェッカーを使用してそれらの使い方を特定できます。

修正方法

ブロックリストに登録されている関数を、許可リストに登録されている関数に置き換えます。

このチェッカーをグループ、プロジェクト、または組織に公開する場合は、ブロックリストに登録されてる関数とその代替関数のリストを作成し、結果のレビュー担当者がそのリストを参照して適切な置き換えができるようにします。

チェッカーの拡張

この欠陥チェッカーには、関数のブロックリストを指定する必要があります。オプション [欠陥の検出] (-checkers) を使用してチェッカーを指定しても、ブロックリストも指定しなければ、チェッカーは有効になりません。Bug Finder チェッカーを使用した非推奨の関数または安全でない関数、キーワード、またはマクロのフラグ設定を参照してください。

すべて展開する

#include <csignal>
#include <iostream>

namespace
{
  volatile std::sig_atomic_t gSignalStatus;
}

void signal_handler(int signal)
{
  gSignalStatus = signal;
}

int main()
{
  // Install a signal handler
  std::signal(SIGINT, signal_handler);

  std::cout << "SignalValue: " << gSignalStatus << '\n';
  std::cout << "Sending signal " << SIGINT << '\n';
  std::raise(SIGINT);
  std::cout << "SignalValue: " << gSignalStatus << '\n';
}

関数 std::signal を非推奨にする場合を考えます。以下をテンプレート XML ファイルの既存の同様のエントリの後ろに追加し、

<?xml version="1.0" encoding="UTF-8"?>
<specifications xmlns="http://www.mathworks.com/PolyspaceCodeBehaviorSpecifications">
  <functions>
     <function name="std::signal">
        <behavior name="FORBIDDEN_FUNC"/>
     </function>
   </functions>
</specifications>
オプション -code-behavior-specifications を使用して XML ファイルを指定します。

解析結果では、関数 std::signal のすべての使用にこのチェッカーによるフラグが設定されます。

class orderedPair {
        int var1;
        int var2;
    public:
        orderedPair() {
            var1 = 0;
            var2 = 0;
        }
        orderedPair(int arg1, int arg2) {
            var1 = arg1;
            var2 = arg2;
        }
        orderedPair& operator=(const orderedPair& rhs) {
            var1 = rhs.var1;
            var2 = rhs.var2;
            return *this;
        } 
        orderedPair& operator+(orderedPair& rhs) {
            var1 += rhs.var1;
            var2 += rhs.var2;
            return *this;
        }  
};

void main() {
    int one=1, zero=0, sum;
    orderedPair firstOrderedPair(one, one);
    orderedPair secondOrderedPair(zero, one);
    orderedPair sumPair;
    
    sum = zero + one;
    sumPair = firstOrderedPair + secondOrderedPair;    
}

orderedPair クラス内で演算子のオーバーロードが使用されているすべての場所を特定する場合を考えます。オーバーロードされた演算子をテンプレート XML ファイルに追加し、

<?xml version="1.0" encoding="UTF-8"?>
<specifications xmlns="http://www.mathworks.com/PolyspaceCodeBehaviorSpecifications">
  <functions>
     <function name="orderedPair::operator=">
        <behavior name="FORBIDDEN_FUNC"/>
     </function>
     <function name="orderedPair::operator+">
        <behavior name="FORBIDDEN_FUNC"/>
     </function>
   </functions>
</specifications>
オプション -code-behavior-specifications を使用して XML ファイルを指定します。

解析では、オーバーロードされた演算子のすべての呼び出しが特定され、それらの使用にフラグが設定されます。この方法を使用すれば、演算子のすべてのインスタンスを検索して参照するのではなく、演算子の特定のオーバーロードを区別できます。

結果情報

グループ: 適切な手法
言語: C | C++
既定値: オフ
コマンド ライン構文: FORBIDDEN_FUNC
影響度: Low

バージョン履歴

R2020a で導入