Comments
Для ядра Linux данным инструментом кто-нибудь пользуется?

Добавьте комментарий в свою статью про бесплатное использование для открытых проектов.
Я раз в несколько лет запускаю. Отослал пару патчей (например, git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=5bf1f439c89d). В общем и целом, малополезно из-за большого количества ложных срабатываний из-за макросов. Другие люди тоже запускают:

$ git log --pretty=format:'%h %aN %ad %gs' --no-merges --grep 'PVS-Studio'
7c6082b903ac Oleh Kravchenko Wed Oct 16 10:24:30 2019 +0300 leds: mlxreg: Fix possible buffer overflow
4016ba85880b Oleh Kravchenko Wed Sep 4 00:18:19 2019 +0300 led: triggers: Fix dereferencing of null pointer
6a258f7d0fbd Colin Ian King Sat Apr 8 00:22:03 2017 +0100 ubifs: Fix cut and paste erroron sb type comparisons
6eeabd8b2b8a Colin Ian King Fri Apr 14 15:25:40 2017 +0100 staging: media: atomisp: fix range checking on clk_num
e56efe9322c5 Colin Ian King Sat Apr 8 18:09:59 2017 +0100 lockd: remove redundant check on block
7ecaeaffd72a Colin Ian King Sat Apr 8 18:28:42 2017 +0100 scsi: aic7xxx: fix order of arguments in function prototype
eea422709fd8 Colin Ian King Fri Apr 14 14:58:02 2017 +0100 scsi: fc: remove redundant check of an unsigned long being less than zero
ba508685d90f Colin Ian King Sat Apr 8 00:44:03 2017 +0100 staging: wilc1000: fix incorrect strncasecmp length
5bf1f439c89d Denis Efremov Fri Oct 25 15:53:25 2013 +0400 xfs:xfs_dir2_node.c: pointer use before check for null


Ядра регулярно анализируется Coverity (https://scan.coverity.com/projects/linux), Klever/LDV (http://linuxtesting.org/results/ldv). К тому же есть специальные инструменты для анализа кода ядра типа sparse, smatch, куча правил для coccinelle. Скоро будет добавлен удобный запуск Clang-Tidy (https://lkml.org/lkml/2020/7/24/1079). Но всё это меркнет, по сравнению с динамическим syzkaller и количеством реальных и пока не исправленных багов, выявленных им (https://syzkaller.appspot.com/upstream).
В общем и целом, малополезно из-за большого количества ложных срабатываний из-за макросов.

Хочу на всякий случай отметить, что разовые запуски анализатора не являются правильным способом его применения. Нерегулярные ненастроенные прогоны неэффективны. Во-первых, как верно отмечено, много ложных срабатываний. Во-вторых, многие ошибки найдены и исправлены к этому моменту более дорогими способами.

Анализатор, во-первых, должен быть настроен, а во-вторых, запускаться регулярно. Как внедрить статический анализатор кода в legacy проект и не демотивировать команду.
Хочу на всякий случай отметить, что разовые запуски анализатора не являются правильным способом его применения. Нерегулярные ненастроенные прогоны неэффективны.

Абсолютно с вами согласен. К сожалению, собственными силами в свободное время для всего ядра linux этого не осилить, поэтому мой комментарий имеет смысл только для тех, кто хочет за вечер запустить и что-то посмотреть.
Во-вторых, многие ошибки найдены и исправлены к этому моменту более дорогими способами.

Более того, я заметил что другие анализаторы и компиляторы берут к себе диагностики, которые ранее я только у вас видел. Лично написал простой шаблон для для coccinelle (он, конечно, дал очень много ложных срабатыванию, но мне так было проще) по образу вашей диагностики и исправил несколько реальных багов (
drm/radeon: fix fb_div check in ni_init_smc_spll_table(), staging: rtl8188eu: fix HighestRate check in odm_ARFBRefresh_8188E())

Предупреждение 11 — в инспектированном куске кода "s->addrlen" вероятнее всего означает длину некоего адреса в байтах, т.е. предупреждение хотя и истинное, но бага здесь нет.

ИМХО и так понятно что тут делает код, лишние скобки только утяжелят его

hpd = hpd && (bool)extract32(tcr, 6, 1);

ИМХО лучше hpd &= (bool)bla-bla-bla


P. S. проверил ассемблерный выхлоп bool &= int, дествительно баг, gcc -Wall на такое не ругается, по-хорошему надо бы багрепорт на gcc запостить (и на clang тоже, наверное).

BTW, проверял вот таким кодом:


bool b;

bool f(int i) {
    b &= (bool)i;
    return b;
}

gcc на это генерирует


        testl   %edi, %edi
        setne   %al
        andb    b(%rip), %al
        movb    %al, b(%rip)
        ret

clang


        xorl    %ecx, %ecx
        testl   %edi, %edi
        setne   %cl
        movzbl  b(%rip), %eax
        andl    %ecx, %eax
        movb    %al, b(%rip)
                                        # kill: def $al killed $al killed $eax
        retq

и с -Os тоже
почему никто не делает


        testl   %edi, %edi
        setne   %al
        andb    %al, b(%rip)
        ret

?

почему никто не делает
testl   %edi, %edi
setne   %al
andb    %al, b(%rip)
ret

В b же надо результат записать,
а в вашем коде нет чего-то типа mov BYTE PTR b[rip], al

я балда, у меня же стоит return b, так что в eax должен быть результат на выходе из функции.


спасибо khim за подсказку

hpd = hpd && (bool)extract32(tcr, 6, 1);
ИМХО лучше hpd &= (bool)extract32(tcr, 6, 1)
нет, не лучше. Потому что если hpd уже false, то ф-ция extract32 в первом варианте не вызывается, а у вас — вызывается.
Only those users with full accounts are able to leave comments. Log in, please.