Не удалось запустить ‘splint’ для проверки кода в встраиваемом проекте.

Вопрос или проблема

Я работаю над встроенной системой Linux (kernel-5.10.24) на платформе SOC. Теперь я пытаюсь использовать splint для анализа кода, но столкнулся с ошибками разбора.

Я использую инструментальные цепочки GNU для SOC (mips), а команда splint выглядит следующим образом,

splint -Iout/buildroot/usr/include/ -I/home/dev/mips-gcc/mips-linux-gnu/libc/usr/include/ -preproc -nestcomment -skipposixheaders -skipisoheaders +
trytorecover +posixlib test_project/src/*.c

И я получил следующую ошибку,

Splint 3.1.2 --- 20 Февраля 2018

Командная строка: Установка -skipposixheaders избыточна с текущим значением
out/buildroot/usr/include/bits/types.h:145:24: Ошибка разбора: Некорректное объявление функции:
    __STD_TYPE : int. Попытка продолжить.
out/buildroot/usr/include/bits/types.h:149:34: Невозможно восстановить после ошибки разбора.
*** Невозможно продолжить.

Я проверил файл types.h и получил,

141 #include <bits/typesizes.h> /* Определяет макросы __*_T_TYPE.  */
142 #include <bits/time64.h>    /* Определяет макросы __TIME*_T_TYPE.  */
143
144
145 __STD_TYPE __DEV_T_TYPE __dev_t;    /* Тип номеров устройств.  */
146 __STD_TYPE __UID_T_TYPE __uid_t;    /* Тип пользовательских идентификаторов.  */
147 __STD_TYPE __GID_T_TYPE __gid_t;    /* Тип групповых идентификаторов.  */
148 __STD_TYPE __INO_T_TYPE __ino_t;    /* Тип серийных номеров файлов.  */
149 __STD_TYPE __INO64_T_TYPE __ino64_t;    /* Тип серийных номеров файлов (LFS).*/
150 __STD_TYPE __MODE_T_TYPE __mode_t;  /* Тип масок атрибутов файлов.  */
151 __STD_TYPE __NLINK_T_TYPE __nlink_t;    /* Тип числа ссылок на файл.  */
152 __STD_TYPE __OFF_T_TYPE __off_t;    /* Тип размеров и смещений файлов.  */

Я не знаю, как исправить эту проблему и запустить splint для проверки моих встроенных проектов.

Ответ или решение

Проблема, с которой вы столкнулись при использовании Splint для анализа кода вашего проекта, связана с тем, что Splint не может корректно обработать некоторые декларации, встречающиеся в стандартных заголовочных файлах bits/types.h. Давайте разберем, как можно исправить эту ситуацию.

Причины проблемы:

  1. Некорректные директивы прерывания: Разработанный для стандартных библиотек C заголовочный файл может содержать конструкции, которые Splint не может распознать. Это касается, например, макросов, определенных компилятором, таких как __STD_TYPE.

  2. Макросы и условия компиляции: Файлы заголовков, которые вы используете, могут зависеть от определенных макросов, которые Splint не знает о. Это может быть связано с то, что вы используете специфические для архитектуры определения, которые могут не поддерживаться или определяться в контексте вашего проекта.

Решение:

Вот несколько подходов, которые могут помочь решить вашу проблему с Splint:

  1. Сохранение заголовков: Используйте опцию -skipposixheaders, как вы уже сделали. Вы можете попробовать также добавить -skipstdheaders, чтобы Splint не проверял стандартные заголовочные файлы C, которые могут вызывать проблемы.

    splint -Iout/buildroot/usr/include/ -I/home/dev/mips-gcc/mips-linux-gnu/libc/usr/include/ -preproc -nestcomment -skipposixheaders -skipisoheaders -skipstdheaders +trytorecover +posixlib test_project/src/*.c
  2. Использование другого анализатора кода: Если проблемы с парсингом продолжаются, возможно, стоит рассмотреть альтернативные инструменты для анализа кода, такие как cppcheck или clang-tidy, которые могут быть более совместимыми с вашей кодовой базой и заголовочными файлами.

  3. Изменение кода: Если проблема локализована в каких-либо конкретных строках вашего кода или в используемых вами заголовочных файлах, возможно, вам придется вручную изменить (или закомментировать) эти строки для успешного прохождения анализа кода.

  4. Поиск обновлений: Если есть возможность, попробуйте найти последние обновления или патчи для Splint. Например, возможно, существуют версии или форки, которые лучше поддерживают специфические конструкции вашего проекта.

Заключение:

Analyzing code in embedded systems can be challenging due to various dependencies in header files as well as architecture-specific declarations. Adjusting the command-line options, considering different static analysis tools, and potentially modifying your code can help you successfully perform code analysis with tools like Splint or their alternatives.

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

Оцените материал
Добавить комментарий

Капча загружается...