Поделиться через


CA2102: перехватывайте исключения, не являющиеся CLSCompliant, с помощью общих обработчиков

TypeName

CatchNonClsCompliantExceptionsInGeneralHandlers

CheckId

CA2102

Категория

Microsoft.Security

Критическое изменение

Не критическое

Причина

Член в сборке, не помеченной атрибутом RuntimeCompatibilityAttribute или помеченной атрибутом RuntimeCompatibility(WrapNonExceptionThrows = false), содержит блок catch, который обрабатывает исключения Exception, однако непосредственно за этим блоком не следует общий блок catch.Данное правило пропускает сборки Visual Basic.

Описание правила

Блок catch, обрабатывающий исключения Exception, перехватывает все исключения, совместимые со спецификацией CLS.Однако, он не перехватывает исключения, не совместимые с CLS.CLS-несовместимые исключения могут вызываться в машинном коде или в управляемом коде, создаваемом ассемблером MSIL.Обратите внимание, что в языках C# и Visual Basic запрещается создавать CLS-несовместимые исключения, а в языке Visual Basic такие исключения не перехватываются.Если блок catch предназначен для обработки всех исключений, используйте следующий синтаксис общего блока catch.

  • В C#: catch {}

  • C++: catch(...) {} или catch(Object^) {}

Необработанные исключения, несовместимые с CLS, создают угрозу безопасности, если в блоке catch удаляются ранее предоставленные разрешения.Поскольку CLS-несовместимые исключения не перехватываются, злоумышленный метод, создавший такое исключение, может получить возможность выполнения с повышенными привилегиями.

Устранение нарушений

Если предполагается перехватывать все исключения, то для устранения нарушения данного правила необходимо добавить общий блок catch или заменить им существующий блок. Можно также пометить сборку атрибутом RuntimeCompatibility(WrapNonExceptionThrows = true).Если в блоке catch удаляются разрешения, повторно реализуйте эту функциональную возможность в общем блоке catch.Если не планируется перехватывать все исключения, замените блок catch, который обрабатывает исключения Exception, блоками catch, обрабатывающими отдельные типы исключений.

Отключение предупреждений

Отключение предупреждений о нарушении данного правила безопасно в том случае, если блок try не содержит операторов, которые могут создавать исключения, несовместимые со спецификацией CLS.Поскольку CLS-несовместимые исключения могут вызываться в любом машинном или управляемом коде, необходимо тщательно изучить весь код, выполняемый в каждой из ветвей блока try.Обратите внимание, что CLS-несовместимые исключения не вызываются средой CLR.

Пример

В следующем примере показан класс MSIL, который вызывает исключение, несовместимое со спецификацией CLS.

.assembly ThrowNonClsCompliantException {}
.class public auto ansi beforefieldinit ThrowsExceptions
{
   .method public hidebysig static void
         ThrowNonClsException() cil managed
   {
      .maxstack  1
      IL_0000:  newobj     instance void [mscorlib]System.Object::.ctor()
      IL_0005:  throw
   }
}

В следующем примере показан метод, содержащий общий блок catch, который удовлетворяет данному правилу.

// CatchNonClsCompliantException.cs 
using System;

namespace SecurityLibrary
{
   class HandlesExceptions
   {
      void CatchAllExceptions()
      {
         try
         {
            ThrowsExceptions.ThrowNonClsException();
         }
         catch(Exception e)
         {
            // Remove some permission.
            Console.WriteLine("CLS compliant exception caught");
         }
         catch
         {
            // Remove the same permission as above.
            Console.WriteLine("Non-CLS compliant exception caught.");
         }
      }

      static void Main()
      {
         HandlesExceptions handleExceptions = new HandlesExceptions();
         handleExceptions.CatchAllExceptions();
      }
   }
}

Выполните компиляцию предыдущих примеров следующим образом.

ilasm /dll ThrowNonClsCompliantException.il
csc /r:ThrowNonClsCompliantException.dll CatchNonClsCompliantException.cs

Связанные правила

CA1031: не перехватывайте типы общих исключений

См. также

Ссылки

Исключения и обработка исключений (Руководство по программированию в C#)

Ilasm.exe (ассемблер IL)

Основные понятия

Переопределение результатов проверки безопасности

Независимость от языка и независимые от языка компоненты