Проверьте файлы кода 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')
возвращает информацию в массиве структур, длина которого является количеством найденных сообщений. Структура имеет следующие поля.
Область | Описание |
---|---|
| Сообщение, описывающее подозрительную конструкцию, которую поймал анализ кода. |
| Вектор номеров линий файла, на который ссылается сообщение. |
| Двухколоночный массив файла столбцов (границы столбцов), к которым применяется сообщение. Первый столбец массива задает столбец в редакторе, с которого начинается сообщение. Второй столбец массива задает столбец в редакторе, где заканчивается сообщение. Существует одна строка в массиве с двумя столбцами для каждого вхождения сообщения. |
Если вы задаете в качестве входных параметров несколько имен файлов, 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
на примере файла, 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 и Среда Разработки.
Чтобы сохранить результаты в структуре и включить идентификаторы сообщений, запустите
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 файла кода 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.
Для получения информации о директиве подавления, %#ok
, и подавление сообщений из вашей программы, см., Настройка индикаторов сообщений анализатора кода и сообщений.