mlint

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

Совместимость

Примечание

mlint не рекомендуется. Использовать checkcode вместо этого.

Альтернативы

Для получения информации об использовании графического интерфейса пользователя к анализатору кода, смотрите Проверить код на ошибки и предупреждения.

Синтаксис

mlint('filename')
mlint('filename','-config=settings.txt')
mlint('filename','-config=factory')
inform=mlint('filename','-struct')
msg=mlint('filename','-string')
[inform,filepaths]=mlint('filename')
inform=mlint('filename','-id')
inform=mlint('filename','-fullpath')
inform=mlint('filename','-notok')
mlint('filename','-cyc')
mlint('filename','-codegen')
mlint('filename','-eml')

Описание

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

Задайте filename как один или несколько векторы символов или строковых массивов или как массив ячеек из векторов символов. Если filename задает несколько векторов символов или строковых массивов, или если filename - нескалярные строковые массивы или массив ячеек из векторов символов, MATLAB® отображает информацию для каждого файла. Вы не можете объединить массивы ячеек из символьных векторов и векторов символов с именами файлов. Для примера вы не можете иметь {'lengthofline', 'buggy'}, 'collatz' как вход.

mlint('filename','-config=settings.txt') переопределяет файл активных настроек по умолчанию настройками, которые включают или подавляют сообщения, как указано в заданном settings.txt файл.

Примечание

При использовании необходимо задать полный путь к settings.txt файл, заданный как -config опция.

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

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

inform=mlint('filename','-struct') возвращает информацию в массиве структур, длина которого является количеством найденных сообщений. Структура имеет следующие поля.

Область

Описание

message

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

line

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

column

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

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

msg=mlint('filename','-string') возвращает информацию в виде вектора символов msg. Если вы задаете в качестве входных параметров несколько имен файлов, msg содержит информацию для каждого файла, разделенную 10 равными знаками символов (=), пространство, имя файла, пространство и 10 символов знака равенства.

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

[inform,filepaths]=mlint('filename') дополнительно возвращается filepaths, абсолютные пути к именам файлов в том же порядке, в котором вы их задали.

inform=mlint('filename','-id') запрашивает идентификатор сообщения, где идентификатор является вектором символов формы ABC.... При возвращении в структуру выход также имеет id поле, которое является идентификатором, связанным с сообщением.

inform=mlint('filename','-fullpath') принимает, что входы файлов являются абсолютными путями, так что mlint не пытается найти их.

inform=mlint('filename','-notok') выполняет mlint для всех линий в filename, даже те линии, которые заканчиваются mlint директива подавления, %#ok.

mlint('filename','-cyc') отображает сложность McCabe (также называемую цикломатической сложностью) каждой функции в файле. Более высокие значения сложности Маккейба указывают на более высокую сложность, и существуют некоторые доказательства того, что программы с более высокими значениями сложности с большей вероятностью содержат ошибки. Часто можно снизить сложность функции, разделив её на меньшие, более простые функции. В целом меньшие значения сложности указывают на программы, которые легче понять и изменить. Некоторые люди выступают за разделение программ, которые имеют рейтинг сложности более 10.

mlint('filename','-codegen') включает сообщения генерации кода для отображения в Командном окне.

mlint('filename','-eml') '-eml' не рекомендуется. Использование '-codegen' вместо этого.

Примеры

Следующие примеры используют lengthofline.m, который является примером файла с кодом MATLAB, который можно улучшить. Вы можете найти его в matlabroot/help/techdoc/matlab_env/examples. Если необходимо запустить примеры, сохраните копию lengthofline.m в местоположение на пути MATLAB.

Выполнение mlint в файле без опций

Чтобы запустить mlint на примере файла, lengthofline.m, run

mlint('lengthofline')

MATLAB отображает сообщения M-Lint для lengthofline.m в Командном окне:

L 22 (C 1-9): The value assigned here to variable 'nothandle' might never be used.
L 23 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 24 (C 5-11): 'notline' might be growing inside a loop. Consider preallocating for speed.
L 24 (C 44-49): Use STRCMPI(str1,str2) instead of using LOWER in a call to STRCMP.
L 28 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 34 (C 13-16): 'data' might be growing inside a loop. Consider preallocating for speed.
L 34 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD.
                Type 'doc struct' for more information.
L 38 (C 29): Use || instead of | as the OR operator in (scalar) conditional statements.
L 39 (C 47): Use || instead of | as the OR operator in (scalar) conditional statements.
L 40 (C 47): Use || instead of | as the OR operator in (scalar) conditional statements.
L 42 (C 13-16): 'data' might be growing inside a loop. Consider preallocating for speed.
L 43 (C 13-15): 'dim' might be growing inside a loop. Consider preallocating for speed.
L 45 (C 13-15): 'dim' might be growing inside a loop.Consider preallocating for speed.
L 48 (C 52): There may be a parenthesis imbalance around here.
L 48 (C 53): There may be a parenthesis imbalance around here.
L 48 (C 54): There may be a parenthesis imbalance around here.
L 48 (C 55): There may be a parenthesis imbalance around here.
L 49 (C 17): Terminate statement with semicolon to suppress output (in functions).
L 49 (C 23): Use of brackets [] is unnecessary. Use parentheses to group, if needed.

Для получения дополнительной информации об этих сообщениях и способах улучшения кода см. раздел «Изменение кода на основе сообщений анализатора кода» в документации MATLAB Desktop Tools и Среда Разработки.

Выполнение mlint с опциями для отображения идентификаторов и возврата результатов в структуру

Чтобы сохранить результаты в структуре и включить идентификаторы сообщений, запустите

inform=mlint('lengthofline', '-id')

MATLAB возвращает

inform = 

19x1 struct array with fields:
    message
    line
    column
    id

Чтобы увидеть значения для первого сообщения, запустите

inform(1)

Отображает MATLAB

ans = 

    message: 'The value assigned here to variable 'nothandle' might never be used.'
       line: 22
     column: [1 9]
         id: 'NASGU'

Здесь сообщение предназначено для значения, которое появляется в линии 22 и простирается от столбца 1-9 в файле NASGU. идентификатор сообщения 'The value assigned here to variable 'nothandle' might never be used.'.

Отображение сложности McCabe с mlint

Чтобы отобразить сложность McCabe файла кода MATLAB, запустите mlint с -cyc опция, как показано в следующем примере (при условии сохранения lengthofline.m в локальную папку).

mlint lengthofline.m -cyc

Результаты, отображаемые в Командном окне, показывают сложность файла Маккейба, за которой следуют сообщения M-Lint, как показано здесь:

L 1 (C 23-34): The McCabe complexity of 'lengthofline' is 12.
L 22 (C 1-9): The value assigned here to variable 'nothandle' might never be used.
L 23 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 24 (C 5-11): 'notline' might be growing inside a loop. Consider preallocating for speed.
L 24 (C 44-49): Use STRCMPI(str1,str2) instead of using UPPER/LOWER in a call to STRCMP.
L 28 (C 12-15): NUMEL(x) is usually faster than PROD(SIZE(x)).
L 34 (C 13-16): 'data' might be growing inside a loop. Consider preallocating for speed.
L 34 (C 24-31): Use dynamic fieldnames with structures instead of GETFIELD. Type 'doc struct'
 for more information.
L 38 (C 29): Use || instead of | as the OR operator in (scalar) conditional statements.
L 39 (C 47): Use || instead of | as the OR operator in (scalar) conditional statements.
L 40 (C 47): Use || instead of | as the OR operator in (scalar) conditional statements.
L 42 (C 13-16): 'data' might be growing inside a loop. Consider preallocating for speed.
L 43 (C 13-15): 'dim' might be growing inside a loop. Consider preallocating for speed.
L 45 (C 13-15): 'dim' might be growing inside a loop. Consider preallocating for speed.
L 48 (C 52): There may be a parenthesis imbalance around here.
L 48 (C 53): There may be a parenthesis imbalance around here.
L 48 (C 54): There may be a parenthesis imbalance around here.
L 48 (C 55): There may be a parenthesis imbalance around here.
L 49 (C 17): Terminate statement with semicolon to suppress output (in functions).
L 49 (C 23): Use of brackets [] is unnecessary.  Use parentheses to group, if needed.

См. также

mlintrpt, profile

Как

Представлено до R2006a