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


Анализ качества кода С++ приложений для Магазина Windows с помощью функций анализа кода Visual Studio

Средство анализа кода в Microsoft Visual Studio Express 2012 для Windows 8 анализирует код на предмет распространенных проблем и нарушений хорошего стиля программирования. Предупреждения, возникающие в ходе анализа кода, отличаются от ошибок и предупреждений компилятора, потому при анализе кода выполняется поиск конкретных шаблонов кода, которые являются допустимыми, но тем не менее могут вызвать проблемы при использовании кода вами или другими специалистами. Анализ кода позволяет находить дефекты в коде, которые невозможно обнаружить в процессе тестирования. Регулярный запуск средства анализа кода в процессе разработки позволяет создать приложение более высокого качества.

Примечание

В Visual Studio Ultimate 2012, Visual Studio Premium 2012 и Visual Studio Professional 2012 можно пользоваться всеми функциональными возможностями анализа кода. См. статью Анализ качества приложений с помощью средств анализа кода в библиотеке MSDN.

Содержание раздела

Рассматриваются следующие вопросы:

Запуск анализа кода

Анализ и разрешение предупреждений анализа кода

Подавление предупреждений анализа кода

Поиск и фильтрация результатов анализа кода

Предупреждения анализа кода C++

Запуск анализа кода

Чтобы запустить анализ кода для решения Visual Studio, выполните следующие действия:

  • В меню Построение выберите Выполнить анализ кода в решении.

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

  1. Выберите имя проекта в обозревателе решений и затем выберите Свойства.

  2. На странице свойств проекта выберите Анализ кода и установите флажок Включить анализ кода для C/C++ при построении.

Решение компилируется, и запускается анализ кода. Результаты выводятся в окне "Анализ кода".

Окно анализа кода

Анализ и разрешение предупреждений анализа кода

Чтобы проанализировать конкретное предупреждение, выберите заголовок предупреждения в окне "Анализ кода". Предупреждение разворачивается, позволяя просмотреть подробные сведения о проблеме. Когда возможно, в анализе кода отображаются номер строки и логика анализа, которые стали причиной предупреждения.

Расширенное предупреждение анализа кода

При разворачивании предупреждения строки кода, которые вызвали предупреждение, выделяются в редакторе кода Visual Studio.

Выделенный исходный код

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

Совет

Повторно запустить анализ кода можно из окна "Анализ кода". Нажмите кнопку Анализировать и выберите область анализа. Можно повторно запустить анализ для всего решения или для выбранного проекта.

Подавление предупреждений анализа кода

В некоторых случаях разработчик может принять решение не разрешать предупреждение анализа кода. Возможно, разрешение предупреждения требует слишком значительного переписывания кода в сравнении с вероятностью того, что проблема проявит себя в какой-либо реальной его реализации. Или, например, разработчик может посчитать, что используемая в предупреждении логика анализа не соответствует данному контексту. Можно подавить отдельные предупреждения, чтобы они больше не отображались в окне "Анализа кода".

Чтобы подавить предупреждение, выполните следующие действия.

  1. Если подробные сведения не отображаются, разверните заголовок предупреждения.

  2. Выберите ссылку Действия внизу предупреждения.

  3. Выберите Подавить сообщение и затем выберите В исходном.

При подавлении сообщения вставляется конструкция #pragma(warning:идентификатор_предупреждения), которая отключает предупреждение для строки кода.

Поиск и фильтрация результатов анализа кода

Можно выполнять поиск в длинных списках предупреждений, а также фильтровать предупреждения в решениях, состоящих из нескольких проектов.

Поиск и фильтрация в окне анализа кода

Предупреждения анализа кода C++

Для кода C++ анализ кода вызывает следующие предупреждения:

Правило

Описание

C6001

Использование неинициализированной памяти

C6011

Разыменование пустого (NULL) указателя

C6029

Использование значения unchecked

C6053

Вызов завершается нулем

C6059

Неверное объединение

C6063

Пропущен строковый аргумент функции форматирования

C6064

Пропущен целочисленный аргумент функции форматирования

C6066

Пропущен аргумент-указатель функции форматирования

C6067

Пропущен аргумент указателя на строку для функции форматирования

C6101

Возврат неинициализированной памяти

C6200

Индекс превышает максимальный размер буфера

C6201

Индекс превышает максимальный размер буфера стека

C6270

Пропущен аргумент с плавающей запятой для функции форматирования

C6271

Лишний аргумент у функции форматирования

C6272

Аргумент не с плавающей запятой у функции форматирования

C6273

Нецелочисленный аргумент у функции форматирования

C6274

Несимвольный аргумент у функции форматирования

C6276

Недопустимое приведение строки

C6277

Недопустимый вызов CreateProcess

C6284

Недопустимый объект в качестве аргумента функции форматирования

C6290

Приоритет логического НЕ и побитового И

C6291

Приоритет логического НЕ и побитового ИЛИ

C6302

Недопустимый аргумент в виде строки символов у функции форматирования

C6303

Недопустимый аргумент в виде строки расширенных символов у функции форматирования

C6305

Несоответствие размера и количества

C6306

Недопустимый переменный аргумент при вызове функции

C6328

Возможное несоответствие типа аргумента

C6385

Переполнение при чтении

C6386

Переполнение при записи

C6387

Недопустимое значение параметра

C6500

Недопустимое свойство атрибута

C6501

Конфликт значений свойств атрибутов

C6503

Ссылки не могут быть пустыми (NULL)

C6504

Значение NULL у переменной, не являющейся указателем

C6505

MustCheck для Void

C6506

Размер буфера для массива или переменной, не являющейся указателем

C6507

Несоответствие свойства Null при Deref=0

C6508

Попытка записи константы

C6509

Использование return в предусловии

C6510

Завершение нулем у переменной, не являющейся указателем

C6511

Свойство MustCheck должно иметь значение Yes или No

C6513

Размер элемента без размера буфера

C6514

Размер буфера превышает размер массива

C6515

Размер буфера для переменной, не являющейся указателем

C6516

Нет свойств у атрибута

C6517

Допустимый размер у буфера, недоступного для чтения

C6518

Записываемый размер у буфера, недоступного для записи

C6519

Недопустимая аннотация: значение свойства NeedsRelease должно быть равно Yes или No

C6521

Разыменование строки недопустимого размера

C6522

Недопустимый размер у строкового типа

C6523

Недопустимый размер строкового параметра

C6525

Недоступное расположение у строки недопустимого размера

C6526

Недопустимый размер у типа строкового буфера

C6527

Недопустимая аннотация: свойство NeedsRelease не может использоваться для значений типа void

C6530

Неизвестный стиль строки формата

C6540

Если для данной функции использовать аннотации атрибута, все ее существующие аннотации __declspec станут недействительными

C6551

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

C6552

Недопустимый Deref= или Notref=: синтаксический анализ выражения невозможен

C6701

Значение не является одним из допустимых значений (Yes/No/Maybe)

C6702

Значение не является строковым

C6703

Значение не является числом

C6704

Непредвиденная ошибка выражения аннотации

C6705

Ожидаемое число аргументов для аннотации не соответствует фактическому числу аргументов для аннотации

C6706

Непредвиденная ошибка аннотации

C28021

Аннотируемый параметр должен быть указателем

C28182

Разыменование пустого (NULL) указателя. Указатель содержит то же значение NULL, которое находилось в другом указателе

C28202

Недопустимая ссылка на нестатический член

C28203

Неоднозначная ссылка на член класса

C28205

_Success_ или _On_failure_ используется в недопустимом контексте

C28206

Левый операнд указывает на структуру, используйте "->"

C28207

Левый операнд является структурой, используйте "."

C28210

Аннотации для контекста __on_failure не должны находиться в явном предварительном контексте

C28211

Для SAL_context ожидалось имя статического контекста

C28212

Для аннотации ожидалось выражение указателя

C28213

Аннотация _Use_decl_annotations_ должна использоваться для ссылки, без изменения, перед объявлением

C28214

Допустимые имена параметров атрибута: p1...p9

C28215

typefix нельзя применять к параметру, который уже имеет typefix

C28216

Аннотация checkReturn применяется только к постусловиям для конкретного параметра функции

C28217

Для функции число параметров аннотации не совпадает с числом параметров, обнаруженных в файле

C28218

Для параметра функции принадлежащий аннотации параметр не совпадает с параметром, найденным в файле

C28219

Для параметра аннотации ожидался член перечисления

C28220

Для параметра аннотации ожидалось целочисленное выражение

C28221

Для параметра аннотации ожидалось строковое выражение

C28222

Для аннотации ожидалось __yes, __no или __maybe

C28223

В аннотации не найден ожидаемый токен или идентификатор

C28224

Аннотации требуются параметры

C28225

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

C28226

Аннотация не может также быть PrimOp (в текущем объявлении)

C28227

Аннотация не может также быть PrimOp (см. предыдущее объявление)

C28228

Параметр аннотации: невозможно использовать тип в аннотации

C28229

Аннотация не поддерживает параметры

C28230

Тип параметра не содержит членов

C28231

Аннотация допустима только для массива

C28232

Ни к одной аннотации не применено pre, post или deref

C28233

pre, post или deref применено к блоку

C28234

Выражение __at не применяется к текущей функции

C28235

Функция не может использоваться изолированно как аннотация

C28236

Аннотацию нельзя использовать в выражениях

C28237

Аннотация в параметре больше не поддерживается

C28238

Аннотация в параметре содержит несколько значений value, stringValue и longValue. Используйте paramn=xxx

C28239

Аннотация в параметре одновременно содержит значение value, stringValue или longValue и выражение paramn=xxx. Используйте только paramn=xxx

C28240

Аннотация в параметре содержит param2, но не содержит param1

C28241

Аннотация для функции в параметре не распознана

C28243

Аннотации для функции в параметре требуется больше разыменований, чем допускает фактический аннотируемый тип

C28245

Аннотация для функции аннотирует "this" в функции, не являющейся членом

C28246

Аннотация в параметре для функции не соответствует типу параметра

C28250

Несогласованная аннотация функции: предыдущий экземпляр содержит ошибку

C28251

Несогласованная аннотация функции: этот экземпляр содержит ошибку

C28252

Несогласованная аннотация функции: параметр имеет другие аннотации в этом экземпляре

C28253

Несогласованная аннотация функции: параметр имеет другие аннотации в этом экземпляре

C28254

Dynamic_cast<>() не поддерживается в аннотациях

C28262

В функции обнаружена синтаксическая ошибка аннотации

C28263

Во встроенной аннотации обнаружена синтаксическая ошибка условной аннотации

C28264

Значения списков результатов должны быть константами

C28267

В аннотациях для функции обнаружена синтаксическая ошибка для аннотации

C28272

Аннотация для функции: параметр не согласуется с объявлением функции при проверке

C28273

Подсказки для функции не согласуются с объявлением функции

C28275

Значение параметра для _Macro_value_ равно NULL

C28279

Для символа обнаружен begin без соответствующего end

C28280

Для символа обнаружен end без соответствующего begin

C28282

Строки формата должны находиться в предусловиях

C28285

Для функции: синтаксическая ошибка в параметре

C28286

Для функции: синтаксическая ошибка рядом с окончанием

C28287

Для функции: синтаксическая ошибка в аннотации _At_() (не распознано имя параметра)

C28288

Для функции: синтаксическая ошибка в аннотации _At_() (недопустимое имя параметра)

C28289

Для функции: ReadableTo или WritableTo не содержало спецификацию ограничения в качестве параметра

C28290

Количество внешних элементов в аннотации для функции превышает фактическое число параметров

C28291

Постусловие null/notnull в deref уровня 0 не имеет смысла для функции

C28300

Несовместимые типы операндов выражения для оператора

C28301

Для первого объявления функции отсутствуют аннотации

C28302

В аннотации обнаружен дополнительный оператор _Deref_

C28303

В аннотации обнаружен неоднозначный оператор _Deref_

C28304

Обнаружен неверно размещенный оператор _Notref_, применяемый к токену

C28305

При синтаксическом анализе токена обнаружена ошибка.

C28350

Аннотация описывает ситуацию, к которой неприменимы условия

C28351

Аннотация описывает ситуацию, когда динамическое значение (переменная) не может использоваться в условии