exponenta event banner

checkcode

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

Описание

пример

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

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

пример

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

пример

info = checkcode(___,'-struct') возвращает информацию в виде nоколо-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. Выберите Code Analyzer на левой панели.

  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 - символьный вектор. При возврате в структуру выходные данные также имеют id , который представляет собой идентификатор, связанный с сообщением.
'-fullpath' Предположим, что имена входных файлов являются абсолютными путями, так что checkcode не пытается найти их.
'-notok'

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

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

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

'-config=settingsfile'

'-config=factory'

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

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

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

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

свернуть все

Информация о сообщении, возвращенная как nоколо-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