Санкт-Петербургский государственный университет
Опубликован: 25.07.2014 | Доступ: свободный | Студентов: 1039 / 80 | Длительность: 17:26:00
Лекция 15:

Visual Studio 2013 и ее возможности для надежных и безопасных вычислений (trustworthy computing)

< Лекция 14 || Лекция 15: 123 || Лекция 16 >

18.2. Поддержка trustworthy computing в Visual Studio 2013

В среде Visual Studio 2013 уделено большое внимание надежным и безопасным вычислениям.

Для этого использованы следующие методы:

Проверки при наборе (вводе) кода. При вводе кода в редакторе, кроме проверок его синтаксической правильности (например, указания на незакрытую скобку, отсутствующую точку с запятой и т.д.), выполняются также проверки на осмысленность, семантическую корректность кода. Например, диагностируется ввод недостижимого кода (unreachable code) - например, если введен оператор if, в котором часть кода в одной из альтернатив, перед которой сти оператор break, оказывается недостижимой. В таких случаях на вкладке сообщений об ошибках выдаются соответствующие предупреждения, помеченные желтым осклицательным знаком.

Проверки, выполняемые компилятором. Например, если на языке Visusal C# в коде описана переменная x без инициализации, а затем она используется, компилятор выдает сообщение об ошибке. В отличие от более старых языков, например, Си или C++ (в unmanaged-варианте), в новых языках, таких, как C#, подобная ситуация считается ошибкой и не приводит вместо этого к ненадежному "случайному" поведению кода, зависящему от значения, случайно оказавшегося значением переменной.

Анализ кода. В главном меню среды имеется специальный пункт Analyze (расположен справа от пункта Architecture). Он содержит ряд действий по анализу кода, важных как с точки зрения надежных и безопасных вычислений, так и с точки зрения проверки качества кода (например, его эффективности). Данный пункт меню имеет следующие подпункты:

  • Performance and Diagnostics - анализ производительности программы;
  • Profiler - профилирование программы (см. "Обзор возможностей .NET" );
  • Run Code Analysis on Solution - самый важный пункт, с точки зрения надежных и безопасных вычислений; о нем подробнее - ниже. Выполняет анализ всего кода решения;
  • Configure Code Analysis for Solution - установки для анализа кода решения;
  • Run Code Analysis on <project name> - выполняет анализ кода только указанного проекта, входящего в решение;
  • Configure Code Analysis for<project name> - установки для анализа кода проекта;
  • Calculate Code Metrics for Solution - вычисление набора метрик для кода решения; анализ этих метрик важен для оценки качества кода, а в некоторых случаях - и его надежности. Примеры метрик: цикломатическое число графа управления программы; число операторов и описаний в программе; степень сцепления классов и методов в классе;
  • Analyze Solution for Code Clones - анализ и диагностика совпадающих участков (клонов) кода. Читатель без труда поймет, в каких ситуациях это возможно и насколько это важно;
  • Windows - переключение на окна основных инструментов этого пункта: Performance Explorer, результатов анализа кода, результатов вычисления метрик кода, результатов анализа кода на наличие клонов.

Тестирование и анализ результатов тестирования кода с помощью инструментов Visual Studio. Как уже говорилось, среда Visual Studio содержит генератор unit-тестов NUnit (точнее, этот инструмент может быть дополнительно инсталлирован в среду Visual Studio как внешний программный пакет с помощью утилиты NuGet) и средства запуска unit-тестов, управления их запуском и анализа результатов тестирования. Имеются и другие генераторы тестов для среды Visual Studio. В настоящее время тестирование до сих пор остается основным методом верификации (проверки правильности) кода, очень важной с точки зрения надежных и безопасных вычислений. Следует учесть, что в текстах справки и поддержки (help) и в документации по Visual Studio термин верификация (verification) означает именно тестирование, а не формальную верификацию (доказательство соответствия реализации кода его формальной спецификации). Возможно, в будущих версиях появится и встроенный верификатор, аналогично системе Spec# [38], основанной на спецификации кода в стиле design-by-contract [38], которая остается пока исследовательской разработкой Microsoft Research и не является частью коммерческой версии Visual Studio. Доступна как plug-in.

На рис. 18.1 изображено использование пункта меню Analyze с целью запуска анализа кода решения. В окне Output выдаются трассировочные сообщения о ходе анализа и обнаруженных ошибках. В данном примере кода анализ ошибок не обнаружил.

Использование в среде VS 2013 пункта меню Analyze для анализа кода проекта (решения)

увеличить изображение
Рис. 18.1. Использование в среде VS 2013 пункта меню Analyze для анализа кода проекта (решения)

Рекомендации по надежности и безопасности кода (secure code) в документации MSDN по Visual Studio. Широко известна книга [40] по разработке безопасного кода. Ее обновленный материал доступен в документации на страницах MSDN [59].

Что касается перечня проверок, выполняемых при анализе кода, их список приведен на страницах MSDN [60].

На рис. 18.2 изображена начальная страница MSDN с описанием проверок кода, выполняемых при анализе.

Начальная страница MSDN с описанием проверок кода, выполняемых при анализе

увеличить изображение
Рис. 18.2. Начальная страница MSDN с описанием проверок кода, выполняемых при анализе

К числу проверок относятся проверки безопасности (например, наличия аннотирования кода соответствующими атрибутами безопасности), проверки соблюдения Common Language Specification (CLS compliance), характерных для платформы .NET; CLS-совместимость гарантирует возможность сочетания в коде решения для .NET использования разных языков (пример правила CLS-совместимости: не рекомендуется иметь в определении класса метод и поле с одним и тем же именем, хотя языком C# это не запрещается), проверки правильности дизайна (например, отсутствия конструкторов в абстрактных классах, которых не должно быть, так как от абстрактного класса, по его природе, нельзя образовывать объекты).

Как эксперт по надежным и безопасным вычислениям, я проверил на небольших работающих примерах специфику некоторых проверок в VS 2013. Имеются классические верификаторы (анализаторы исходного кода), такие, как lint, который входил еще в первые версии системы UNIX и выполнял проверки корректности кода на языке Си. С этой точки зрения, некоторых проверок в анализаторе кода в среде VS 2013 немного нехватает.

Например, классическая ситуация: в коде использовано недостижимое условие

if (x == 1 && x == 2)
    

(программист в спешке перепутал логические операции "И" и "ИЛИ"). К сожалению, в отличие от lint, анализатор кода VS 2013 отсутствие таких недостижимых условий не проверяет, даже в режиме полной проверки.

Другая классическая ситуация - fall through ("проваливание"): в операторе switch несколько альтернатив case не содержат ни операторов break, ни операторов return. В результате, по семантике C / C++, если управление передано в первую из альтернатив, то вслед за ней будут исполнены все остальные, в которых нет break / return:

int x = 1;
switch (x) {
    case 1: Console::WriteLine("x = 1");
    case 2: Console::WriteLine("x = 2");
}
    

Я проверил эту ситуацию, создав консольный проект на языке Visual C++. Ни компилятор, ни анализатор кода VS 2013 никаких предупреждений не выдают, и при выполнении программы выдается:

x = 1
x = 2.
    

Утилита lint подобные проверки выполняет.

Надеюсь, что в следующих версиях или обновлениях среды VS 2013 эти недочеты будут исправлены.

< Лекция 14 || Лекция 15: 123 || Лекция 16 >
Александр Калинин
Александр Калинин

Осенью прошёл курс и получил ключ. Но т.к. уже имел действующую подписку, то ключом не воспользовался. Сейчас захожу сюда, а про DreamSpark вообще ни слова. Где же мой ключ?