Project

General

Profile

Wiki » History » Version 9

Елена Кузьмина, 05/05/2022 05:17 PM

1 7 Alexey Khoroshilov
{{toc}}
2
3 4 Alexey Khoroshilov
h2. Статический анализ ядра
4
5 5 Alexey Khoroshilov
Инструкции по работе с интерфейсом разметки (SVACER) доступны в разделе "файлы":https://forge.ispras.ru/projects/lvc/files.
6
7
8 4 Alexey Khoroshilov
Для получения доступа к временному серверу для совместной работы над разметкой предупреждений SVACE пишите:
9
khoroshilov@ispras.ru
10
11 5 Alexey Khoroshilov
На этом сервере необходимо выбрать проект linux, ветка linux-5.10.y, в которой есть единственный снэпшот с результатами.
12
13
Для того, чтобы отфильтровать те предупреждения, которые относятся к выбранным подсистемам в режиме Review необходимо нажать на кнопку Filters->Basic...
14
и внизу в поле Files ввести список интересующих путей, например:
15
<pre>
16
security/selinux;net/ipv4
17
</pre>
18
При этом надо убедиться, что кнопка .* рядом с Files нажата.
19
20
По результатам анализа 
21
# Необходимо выставить вердикт:
22
** Confirmed -- ошибка, которую рекомендуется исправить
23
** Won't fix -- истинное срабатывание, которое по тем или иным причинам исправлять нецелесообразно
24
** False Positive - ложное срабатывание инструмента статического анализа
25
** Unclear - требуется дополнительный анализ
26
# На вкладке Comment необходимо оставить комментарий, поясняющий вердикт.
27
  Сейчас это обязательно хотя бы в самом коротком виде, т.к. это единственный способ увидеть автора проведённого исследования предупреждения.
28 7 Alexey Khoroshilov
29
h3. Типовые ситуации при разметке предупреждений в ядре
30
31
h4. Защитное программирование
32
33
Например, чекеры вида UNREACHABLE_CODE.ENUM сообщают о недостижимости кода в switch для ветки по умолчанию, в которой содержится та или иная отладочная печать, например:
34
35
<pre><code class="c">
36
  switch () {
37
  case ENUM1:
38
  ...
39
  default:
40
    dev_dbg(ice_pf_to_dev(pf), "Invalid container type %d\n", c_type);
41
    return -EINVAL;
42
  }
43
</code></pre>
44
45
Этот код, действительно, недостижим при нормальной работе ядра. Тем не менее, его как правило имеет смысл оставить, чтобы при возникновении нештатных ситуаций, управление пошло по более контролируемой логике и в журнале появилась информация об обнаружении нештатной ситуации.
46
47
В этом случае рекомендуется выставить вердикт @Won't fix@ и написать комментарий @Защитное программирование@.
48
49 8 Alexey Khoroshilov
h4. Недостижимый код, зависящий от конфигурации
50
51
Чекеры вида UNREACHABLE_CODE.* сообщают о недостижимости кода, в который, действительно, недостижим в конфигурации, которая подвержалась статическому анализу, но может быть достижим в другой конфигурации. В SVACE в будущем планируется поддержать выявление таких ситуаций и подавлять предупреждения.
52
53
До тех пор при разметке предупреждений рекомендуется выставить вердикт @Won't fix@ и написать комментарий @Код достижим в другой конфигурации@.
54 5 Alexey Khoroshilov
55 9 Елена Кузьмина
h4. FREE_OF_ARITHM: Deallocating memory through a pointer 'fl' obtained as a result of arithmetic operation 
56
57
Срабатывают следущие чекеры: FREE_OF_ARITHM
58
59
Стандартный прием приведения члена структуры к содержащей его структуре. Используется для работы со списками, RCU, в различных видах циклов и пр. Т.к. для приведения используется макрос contaner_of, который производит арифметику, то использование такого приема вполне безопасно.
60
Пример:
61
<pre><code class="c">
62
struct ip6_flowlabel {
63
	...
64
	struct rcu_head		rcu;
65
	...
66
};
67
68
static void fl_free_rcu(struct rcu_head *head)
69
{
70
	struct ip6_flowlabel *fl = container_of(head, struct ip6_flowlabel, rcu);
71
        ...
72
	kfree(fl);  // // <-- FREE_OF_ARITHM
73
}
74
75
static void fl_free(struct ip6_flowlabel *fl)
76
{
77
        ...
78
	call_rcu(&fl->rcu, fl_free_rcu);
79
}
80
</code></pre>
81
82 4 Alexey Khoroshilov
h2. Взаимодействие с международным сообществом
83 1 Alexey Khoroshilov
84 6 Alexey Khoroshilov
Для отправки патчей в основную ветку ядра следуйте следующим инструкциям:
85
[[How_to_send_patches_to_kernel|Отправка патчей в ядро]].