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 52): Invalid syntax at ';'. A '(' might be missing a closing ')'.
L 47 (C 53): Invalid syntax at ')'. A '[' might be missing a closing ']'.
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×5 struct
    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 52): Invalid syntax at ';'. A '(' might be missing a closing ')'.
L 47 (C 53): Invalid syntax at ')'. A '[' might be missing a closing ']'.
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 52): Invalid syntax at ';'. A '(' might be missing a closing ')'.
L 47 (C 53): Invalid syntax at ')'. A '[' might be missing a closing ']'.
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. При Настройках по умолчанию, в разделе Aesthetics и Readability, очищают Использование сообщения вместо | как операция ИЛИ в (скалярных) условных операторах.

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

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

Запустите checkcode на файле в качестве примера с помощью пользовательского файла настроек mysettings.txt. Использование сообщения вместо | как операция ИЛИ в (скалярных) условных операторах подавлено и больше не отображается в списке сообщений.

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 52): Invalid syntax at ';'. A '(' might be missing a closing ')'.
L 47 (C 53): Invalid syntax at ')'. A '[' might be missing a closing ']'.
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 поле, которое является ID, сопоставленным с сообщением.
'-fullpath' Примите, что входные имена файлов являются абсолютными путями, так, чтобы checkcode не пытается определить местоположение их.
'-notok'

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

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

'-cyc'Отобразите Маккейба цикломатическая сложность каждой функции в файле. В общем случае более низкие значения сложности указывают на программы, которые легче изучить и изменить. Данные свидетельствуют, что программы с более высокими значениями сложности, более вероятно, будут содержать ошибки. Часто, можно понизить сложность функции путем деления его на меньшие, более простые функции. Некоторые люди защищают разделять программы, которые имеют значение сложности более чем 10.
'-modcyc'Отображает модифицированную цикломатическую сложность каждой функции в файле. Модифицированная цикломатическая сложность для функции равна Маккейбу цикломатическая сложность за исключением одного различия. Маккейб цикломатическая сложность считает каждый отдельный 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

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

Передайте информацию, возвращенную как вектор символов. Если вы задаете несколько имен файлов, как введено, или если вы задаете массив ячеек, как введено, 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