CS.RESOURCE.AUTOBOXING

ループ内での自動ボックス化

このチェッカーは、自動ボックス化による値型から参照型オブジェクトへの自動変換のインスタンスを、そのような変換がループ本体内で行われるたびに報告します。自動ボックス化は、値型の定数または変数と参照型オブジェクトの間の割り当てまたは二項演算の応用で、コンパイラによって適用されます。自動ボックス化には、ヒープでのメモリの割り当てやオブジェクトの構築が含まれるため、システムリソースを大幅に消費する可能性があります。ループ内でこのような変換が行われる場合は、特に影響を及ぼす可能性があります。

脆弱性とリスク

自動ボックス化により、ソフトウェアのパフォーマンスが低下し、消費されるリソースの量に影響するため、ソフトウェアの応答性が低下したり、利用できるリソースが完全に枯渇する可能性があります。

軽減と防止

これらの悪影響を防ぐために、自動ボックス化を避ける必要があります。

脆弱コード例 1

コピー
  using System;
  namespace AutoUnBox
  {
    class AutoBox {
      public void Example1() {
              TestAutoBox count = new TestAutoBox();
        for (long i = 0; i < 10; i++) {
          count += 0x2A;                       // CS.RESOURCE.AUTOBOXING
        }
     }
   }
   class TestAutoBox {
 
     TestAutoBox(int intValue) {
       this.value1 = intValue;
     }
 
     private int value1 { set; get; }
 
     public static implicit operator TestAutoBox(int v) {
       return new TestAutoBox(v);
    }
   }
 }

Klocwork は 8 行目で指摘レポートを生成し、「'count' に自動的に変換されるプリミティブ型 'int' に、8 行目で自動ボックス化が適用されている」ことを示します。この場合、自動ボックス化はループ内で行われており、オブジェクト変数 count による '+' 演算の前に、定数の整数値を最初にオブジェクトに変換しています。

修正コード例 1

コピー
  using System;
  namespace AutoUnBox
  {
    class AutoBox {
      public void Example1() {
              TestAutoBox count = new TestAutoBox();
        int countValue = 0;
        for (long i = 0; i < 10; i++) {
          countValue += 0x2A;                       // no CS.RESOURCE.AUTOBOXING
       }
       count = countValue;
     }
   }
   class TestAutoBox {
 
     TestAutoBox(int intValue) {
       this.value1 = intValue;
     }
 
     private int value1 { set; get; }

     public static implicit operator TestAutoBox(int v) {
       return new TestAutoBox(v);
     }
   }
 }

修正されたコードでは、8 行目で両方のオペランドがループ内のビルトイン整数であるため、指摘は報告されません。