CA2111: ポインターは参照可能にすることはできません
TypeName |
PointersShouldNotBeVisible |
CheckId |
CA2111 |
[カテゴリ] |
Microsoft.Security |
互換性に影響する変更点 |
あり |
原因
パブリックまたはプロテクトの System.IntPtr フィールドまたは System.UIntPtr フィールドが読み取り専用ではありません。
規則の説明
IntPtr と UIntPtr は、アンマネージ メモリにアクセスするときに使用するポインターの型です。ポインターがプライベート、内部、または読み取り専用のいずれでもない場合、悪意のあるコードで、ポインターの値が変更される可能性があります。結果的に、メモリの任意の位置にアクセスされたり、アプリケーション エラーやシステム エラーの原因になります。
ポインターのフィールドを含む型に対するアクセスを保護するには、「CA2112: セキュリティで保護された型はフィールドを公開してはなりません」を参照してください。
違反の修正方法
読み取り専用、内部、またはプライベートにすることで、ポインターを保護します。
警告を抑制する状況
ポインターの値に依存していない場合は、この規則による警告を抑制します。
使用例
この規則に違反するポインターと適合するポインターを次のコードに示します。ポインターをプライベートにしないと、規則「CA1051: 参照できるインスタンス フィールドを宣言しないでください」にも違反するので注意してください。
using System;
namespace SecurityRulesLibrary
{
public class ExposedPointers
{
// Violates rule: PointersShouldNotBeVisible.
public IntPtr publicPointer1;
public UIntPtr publicPointer2;
protected IntPtr protectedPointer;
// Satisfies the rule.
internal UIntPtr internalPointer;
private UIntPtr privatePointer;
public readonly UIntPtr publicReadOnlyPointer;
protected readonly IntPtr protectedReadOnlyPointer;
}
}
関連規則
CA2112: セキュリティで保護された型はフィールドを公開してはなりません
CA1051: 参照できるインスタンス フィールドを宣言しないでください