C and C++


LANG.LAMBDA.CAPTURE : 暗黙的なラムダ式のキャプチャ

要旨

自動変数(自動記憶期間を持つ変数)が、ラムダ式内で暗黙的にキャプチャされています。

プロパティ

クラス名 Implicit Lambda Capture
日本語クラス名 暗黙的なラムダ式のキャプチャ
クラス分類 スタイル (style)
ニーモニック LANG.LAMBDA.CAPTURE
カテゴリー
AUTOSARC++14 AUTOSARC++14:A5-1-2 Variables shall not be implicitly captured in a lambda expression.
MisraC++2023 MisraC++2023:8.1.2 Variables should be captured explicitly in a non-transient lambda
対応言語 C および C++ で利用可能です。
有効/無効設定 このワーニングクラスのチェックはデフォルトで無効になっており、プロジェクトには非正規の C向けAST が必要になります。有効にするにはプロジェクト設定ファイル (configuration file) に以下の WARNING_FILTER ルールと RETAIN_UNNORMALIZED_C_AST 設定を追加してください。
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Implicit Lambda Capture"
注:非正規化された AST を継続して使用した場合、使用ディスク容量が増加し解析時間が長くなる可能性があります。

int lambdacapture(int i){
    int x = 5;
    static int y = 6;

    auto lambda_explicit = [&x](int a)->int{
               return a + x;                             // ok: x is captured explicitly
              };

    auto lambda_implicit = [&](int a)->int{
               int tmp;
               tmp = a + x;       // 'Implicit Lambda Capture' warning issued here
               tmp += a + y;                             // ok: y has non-automatic storage duration
               return tmp;
              };

    return lambda_explicit(i) + lambda_implicit(i);
}

関連のある設定ファイルパラメータ

設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。