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


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

Применимо к Windows и к Windows Phone

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

Примечание

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

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

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

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

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

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

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

C++ code analysis warnings

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Совет

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

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

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

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

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

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

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

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

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

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

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

Предупреждения анализа кода 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 на уровне разыменовывания 0

C6508

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

C6509

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

C6510

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

C6511

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

C6513

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

C6514

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

C6515

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

C6516

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

C6517

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

C6518

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

C6519

Недопустимая аннотация: значение свойства NeedsRelease превышает размер массива

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/не NULL на уровне разыменовывания 0 параметра не имеет смысла для функции.

C28300

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

C28301

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

C28302

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

C28303

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

C28304

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

C28305

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

C28350

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

C28351

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