checkcode

Проверьте файлы кода MATLAB на возможные проблемы

Описание

пример

checkcode(filename) отображает сообщения о filename которые сообщают о потенциальных проблемах и возможностях для улучшения кода. Эти сообщения иногда называются сообщениями анализатора кода. Номер линии в сообщении является гиперссылкой, которую можно кликнуть, чтобы перейти непосредственно к этой линии в редакторе. Точный текст checkcode сообщения могут быть изменены между версиями.

checkcode(filename1,...,filenameN) отображает сообщения для каждого заданного filename.

пример

checkcode(___,option1,...,optionN) изменяет возвращенные сообщения на основе заданных флагов опций. Для примера задайте '-modcyc' просить вернуть модифицированную цикломатическую сложность с каждым сообщением. Можно задать опции с любым из входных параметров в предыдущих синтаксисах.

пример

info = checkcode(___,'-struct') возвращает информацию как n-by- 1 массив структур, где n количество найденных сообщений.

msg = checkcode(___,'-string') возвращает информацию в виде вектора символов.

Если вы опускаете '-struct' или '-string' аргумент и вы задаете выходной аргумент, поведение по умолчанию '-struct'.

[___, filepaths] = checkcode(___) также возвращается filepaths, абсолютные пути к именам файлов. Можно задать filepaths с любым из '-struct' или '-string' опции.

Примеры

свернуть все

Выполняйте checkcode на примере файла lengthofline.m. MATLAB ® отображает сообщения анализатора кода для lengthofline.m в Командном окне.

checkcode('lengthofline')
L 21 (C 1-9): The value assigned to variable 'nothandle' might be unused.
L 22 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 23 (C 5-11): The variable 'notline' appears to change size on every loop iteration. Consider preallocating for speed.
L 23 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 27 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 33 (C 13-16): The variable 'data' appears to change size on every loop iteration. Consider preallocating for speed.
L 33 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
L 37 (C 29): When both arguments are numeric scalars, consider replacing | with || for performance.
L 38 (C 47): When both arguments are numeric scalars, consider replacing | with || for performance.
L 39 (C 47): When both arguments are numeric scalars, consider replacing | with || for performance.
L 42 (C 13-15): The variable 'dim' appears to change size on every loop iteration. Consider preallocating for speed.
L 44 (C 13-15): The variable 'dim' appears to change size on every loop iteration. Consider preallocating for speed.
L 47 (C 21): A '[' might be missing a closing ']', causing invalid syntax at ')'.
L 47 (C 51): A '(' might be missing a closing ')', causing invalid syntax at ';'.
L 47 (C 54): Parse error at ']': usage might be invalid MATLAB syntax.
L 48 (C 17): Terminate statement with semicolon to suppress output (in functions).
L 48 (C 23): If you intend to specify expression precedence, use parentheses () instead of brackets [].

Выполняйте checkcode на примере файла lengthofline.m. Включите идентификаторы сообщений и сохраните результаты в структуре.

info = checkcode('lengthofline', '-id')
info=17×1 struct array with fields:
    id
    message
    fix
    line
    column

Просмотрите значения для первого сообщения

info(1)
ans = struct with fields:
         id: 'NASGU'
    message: 'The value assigned to variable 'nothandle' might be unused.'
        fix: 0
       line: 21
     column: [1 9]

Выполняйте checkcode на примере файла lengthofline.m использование '-modcyc' опция. MATLAB ® отображает измененную цикломатическую сложность файла, а затем сообщения анализатора кода для lengthofline.m.

checkcode('lengthofline', '-modcyc')
L 1 (C 23-34): The modified cyclomatic complexity of 'lengthofline' is 12.
L 21 (C 1-9): The value assigned to variable 'nothandle' might be unused.
L 22 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 23 (C 5-11): The variable 'notline' appears to change size on every loop iteration. Consider preallocating for speed.
L 23 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 27 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 33 (C 13-16): The variable 'data' appears to change size on every loop iteration. Consider preallocating for speed.
L 33 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
L 37 (C 29): When both arguments are numeric scalars, consider replacing | with || for performance.
L 38 (C 47): When both arguments are numeric scalars, consider replacing | with || for performance.
L 39 (C 47): When both arguments are numeric scalars, consider replacing | with || for performance.
L 42 (C 13-15): The variable 'dim' appears to change size on every loop iteration. Consider preallocating for speed.
L 44 (C 13-15): The variable 'dim' appears to change size on every loop iteration. Consider preallocating for speed.
L 47 (C 21): A '[' might be missing a closing ']', causing invalid syntax at ')'.
L 47 (C 51): A '(' might be missing a closing ')', causing invalid syntax at ';'.
L 47 (C 54): Parse error at ']': usage might be invalid MATLAB syntax.
L 48 (C 17): Terminate statement with semicolon to suppress output (in functions).
L 48 (C 23): If you intend to specify expression precedence, use parentheses () instead of brackets [].

Подавить определенные сообщения можно путем создания и определения файла настроек. Для примера файл lengthofline.m включает несколько линий, которые используют | вместо || в качестве OR оператор. По умолчанию checkcode флаги этих линий.

checkcode('lengthofline')
L 21 (C 1-9): The value assigned to variable 'nothandle' might be unused.
L 22 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 23 (C 5-11): The variable 'notline' appears to change size on every loop iteration. Consider preallocating for speed.
L 23 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 27 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 33 (C 13-16): The variable 'data' appears to change size on every loop iteration. Consider preallocating for speed.
L 33 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
L 37 (C 29): When both arguments are numeric scalars, consider replacing | with || for performance.
L 38 (C 47): When both arguments are numeric scalars, consider replacing | with || for performance.
L 39 (C 47): When both arguments are numeric scalars, consider replacing | with || for performance.
L 42 (C 13-15): The variable 'dim' appears to change size on every loop iteration. Consider preallocating for speed.
L 44 (C 13-15): The variable 'dim' appears to change size on every loop iteration. Consider preallocating for speed.
L 47 (C 21): A '[' might be missing a closing ']', causing invalid syntax at ')'.
L 47 (C 51): A '(' might be missing a closing ')', causing invalid syntax at ';'.
L 47 (C 54): Parse error at ']': usage might be invalid MATLAB syntax.
L 48 (C 17): Terminate statement with semicolon to suppress output (in functions).
L 48 (C 23): If you intend to specify expression precedence, use parentheses () instead of brackets [].

Создайте файл настроек, который подавляет сообщение, помечающее использование | в качестве OR оператор.

  1. На вкладке «Вкладке Home», в разделе Environment, нажмите кнопку Preferences.

  2. Выберите Анализатор кода на левой панели.

  3. В разделе Настройки по умолчанию в разделе Эстетика и читаемость очистите сообщение Использовать вместо | как оператор OR в (скалярных) условных операторах.

  4. Введите mysettings.txt как имя файла и сохранить его в текущей папке.

  5. Нажмите кнопку «Отмена», чтобы выйти из панели выборов без изменения активных настроек.

Выполняйте checkcode в файле примера с использованием пользовательского файла настроек mysettings.txt. Сообщение Use вместо | в качестве оператора OR в (скалярных) условных операторах подавлено и больше не отображается в списке сообщений.

checkcode('lengthofline','-config=mysettings.txt')
L 21 (C 1-9): The value assigned to variable 'nothandle' might be unused.
L 22 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 23 (C 5-11): The variable 'notline' appears to change size on every loop iteration. Consider preallocating for speed.
L 23 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 27 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 33 (C 13-16): The variable 'data' appears to change size on every loop iteration. Consider preallocating for speed.
L 33 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
L 42 (C 13-15): The variable 'dim' appears to change size on every loop iteration. Consider preallocating for speed.
L 44 (C 13-15): The variable 'dim' appears to change size on every loop iteration. Consider preallocating for speed.
L 47 (C 21): A '[' might be missing a closing ']', causing invalid syntax at ')'.
L 47 (C 51): A '(' might be missing a closing ')', causing invalid syntax at ';'.
L 47 (C 54): Parse error at ']': usage might be invalid MATLAB syntax.
L 48 (C 17): Terminate statement with semicolon to suppress output (in functions).
L 48 (C 23): If you intend to specify expression precedence, use parentheses () instead of brackets [].

Входные параметры

свернуть все

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

Если filename - нескалярные строковые массивы или массив ячеек из векторов символов, MATLAB® отображает информацию для каждого файла.

Примечание

Вы не можете объединить массивы ячеек и символьные массивы имен файлов. Для примера вы не можете иметь {'lengthofline', 'buggy'}, 'collatz' как вход.

Пример: 'lengthofline'

Пример: {'lengthofline', 'buggy'}

Типы данных: char | string

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

ОпцияОписание
'-id'Запросите идентификатор сообщения, где идентификатор является вектором символов. При возвращении в структуру выход также имеет id поле, которое является идентификатором, связанным с сообщением.
'-fullpath' Предположим, что имена входных файлов являются абсолютными путями, так что checkcode не пытается найти их.
'-notok'

Выполняйте checkcode для всех линий в filename, даже те линии, которые заканчиваются checkcode директива подавления, %#ok.

Для получения информации о %#ok и подавление сообщений из вашей программы, см., Настройка индикаторов сообщений анализатора кода и сообщений.

'-cyc'Отобразите цикломатическую сложность McCabe каждой функции в файле. В целом более низкие значения сложности указывают на программы, которые легче понять и изменить. Данные свидетельствуют о том, что программы с более высокими значениями сложности с большей вероятностью содержат ошибки. Часто можно снизить сложность функции, разделив её на меньшие, более простые функции. Некоторые люди выступают за разделение программ, которые имеют значение сложности более 10.
'-modcyc'Отображает измененную цикломатическую сложность каждой функции в файле. Модифицированная цикломатическая сложность для функции равна цикломатической сложности Маккейба, за исключением одного различия. Цикломатическая сложность Маккейба отсчитывает каждого индивидуума case в пределах switch оператор как 1, в то время как измененная цикломатическая сложность отсчитывает все switch оператор как 1. В целом, switch операторы проще вложенных if-elseif-else операторы и, следовательно, модифицированная цикломатическая сложность часто рассматривается как лучшая мера сложности кода.

'-config = settingsfile'

'-config=factory'

Переопределите файл активных настроек по умолчанию указанным файлом настроек. Если указанный файл отсутствует в текущей папке, укажите полный путь к файлу.

Дополнительные сведения о создании файла настроек см. в разделе Сохранение и повторное использование параметров сообщения анализатора кода. Если вы задаете недопустимый файл, checkcode возвращает сообщение, указывающее, что оно не может открыть или считать указанный файл. В этом случае, checkcode использует заводские настройки по умолчанию.

Чтобы игнорировать все файлы настроек и использовать заводские настройки выборов по умолчанию, задайте '-config=factory'.

Выходные аргументы

свернуть все

Информация о сообщении, возвращенная как n-by- 1 массив структур, где n - количество сообщений, возвращаемых checkcode команда. Если вы задаете несколько имен файлов в качестве входных, или если вы задаете массив ячеек в качестве входных, info содержит массив ячеек структур.

Область

Описание

message

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

line

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

column

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

Информация о сообщении, возвращенная как вектор символов. Если вы задаете несколько имен файлов в качестве входных, или если вы задаете массив ячеек в качестве входных, msg содержит вектор символов, где информация для каждого файла разделена 10 знаками равного знака, пространством, именем файла, пространства и 10 знаками равного знака.

Пример: ========== C:\MyMatlabFiles\buggy.m ==========

Абсолютные пути к файлам, заданные как массив ячеек из векторов символов. MATLAB перечисляет filepaths в том же порядке, что и указанные входные файлы.

Совет

Чтобы заставить анализатор кода игнорировать строку кода, используйте %#ok в конце линии. Можно добавлять комментарии после тега.

unsuppressed1 = 10 	% This line will get caught
suppressed2 = 20		%#ok This line will not get caught
suppressed3 = 30		%#ok This line will not get caught

Введенный в R2011b