Есть ли способ заставить Splint или подобное средство статической проверки работать с модулями ядра Linux?

Я скомпилировал (без предупреждений) пример hello-5.c из "Руководства по программированию модуля ядра Linux", и когда я попытался его модифицировать, я получил следующую ошибку:

insmod: error inserting 'hello-5.ko': -1 Unknown symbol in module

Я думал, что попробую splint, чтобы посмотреть, не возникнут ли какие-либо очевидные ошибки, но когда я запустил его, я получил множество предупреждений из заголовков ядра, пока он не вырвался, пытаясь разобрать asm/types.h

anon@anon:~/kernel-source/lkmpg$ splint -I/lib/modules/$(uname -r)/build/include hello-5.c
Splint 3.1.1 --- 03 Nov 2006

( ... lots of warnings ... )

/lib/modules/2.6.24-24-insp8600/build/include/asm/types.h:13:24: Parse Error:
    Suspect missing struct or union keyword: __signed__ :
    unsigned short int. (For help on parse errors, see splint -help
    parseerrors.)
*** Cannot continue.

Так что на самом деле есть два вопроса:

  1. Как исправить ошибку insmod?
  2. Как заставить шину хорошо работать с заголовками ядра?

person Robert S. Barnes    schedule 25.10.2009    source источник


Ответы (2)


Веселая. В настоящее время я сижу в офисе и пытаюсь запустить статическую проверку драйверов ядра Linux :)

Статические средства проверки с трудом обрабатывают ядро ​​Linux, потому что диалект C, используемый в коде ядра, шире, чем тот, который обычно понимается как «язык C». Иногда случается так, что C-интерфейс программы проверки просто не может разобрать постоянно меняющиеся конструкции, используемые в коде.

Как я понял, вы просто используете устаревшую версию чекера (03 Nov 2006), но у вас версия ядра тоже устарела, и я не знаю, какая старше. Что может помочь, так это обновление чекера до его текущей версии или использование актуального клиентского интерфейса C, если чекер поддерживает его переключение.

Более того, если программа проверки может обрабатывать ядро ​​​​Linux, этот факт сразу становится поводом для хвастовства на домашней странице программы проверки. Итак, выберите тот, который утверждает это, и сделайте свои проверки.

person P Shved    schedule 25.10.2009
comment
Ядро и Splint поставляются вместе как часть Ubuntu 8.04, поэтому я думаю, что они, вероятно, должны подходить друг другу. - person Robert S. Barnes; 25.10.2009
comment
Взгляните на ссылку, которую я только что нашел, по использованию шины на модулях ядра. cs.virginia.edu/pipermail/splint-discuss/ 2005 – январь/ - person Robert S. Barnes; 25.10.2009
comment
@ Роберт С. Барнс, да, эта ссылка иллюстрирует то, о чем я говорил: отсутствие поддержки диалекта C GCC. Вероятно, это решение, которое вы искали. - person P Shved; 25.10.2009

Я не уверен, но это может быть то, что я ищу:

splint-discuss Использование Splint в модулях ядра Linux

Он предоставляет настраиваемый файл make, помогающий splint пройти через специальные расширения gcc, используемые в ядре.

person Robert S. Barnes    schedule 25.10.2009