-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbolum14_3.tex
86 lines (77 loc) · 3.04 KB
/
bolum14_3.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
\documentclass[24pt]{article}
\usepackage[turkish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage{url}
\begin{document}
\textbf{14.3 Bir Makronun Tanıtımı}\\
\\
Kod kopyasını veya hataya eğilimli kodları önlemeyi, çekirdek BUG ON,DIV ROUND UP ve FIELD SIZE gibi makrolar sağlar.Bu durumlarda, anlamsal yamalar eski kod modelini arar ve onu yeni kodla değiştirir.Anlamsal bir yama, DIV ROUND UP makrosunun kullanımını tanıtmak için uygun ifadeyi arar.Örneğin (n+d-)/d.Bazı kodlar eşleştirildiğinde, meta değişkenler n ve b, onların uygun ifadelerine bağlıdırlar.Son olarak Coccinelle, n ve d'ye bağlı değerleri kullanarak,kodu aşağıdaki yamada gösterildiği gibi DIV ROUND UP ile yeniden yazar.\\
DIV ROUND UP makro kullanımını tanıtan anlamsal yama\\
\begin{lstlisting}
@ haskernel @
@@
#include <linux/kernel.h>
@ depends on haskernel @
expression n,d;
@@
(
- (((n) + (d)) - 1) / (d))
+ DIV_ROUND_UP(n,d)
|
- (((n) + ((d) - 1)) / (d))
+ DIV_ROUND_UP(n,d)
)
\end{lstlisting}
Üretilmiş Yama Örneği\\
\begin{lstlisting}
--- a/drivers/atm/horizon.c
+++ b/drivers/atm/horizon.c
@@ -698,7 +698,7 @@ got_it:
if (bits)
*bits = (div<<CLOCK_SELECT_SHIFT) | (pre-1);
if (actual) {
- *actual = (br + (pre<<div) - 1) / (pre<<div);
+ *actual = DIV_ROUND_UP(br, pre<<div);
PRINTD (DBG_QOS, "actual rate: %u", *actual);
}
return 0;
\end{lstlisting}
\begin{document}
BUG ON makrosu bir ifadenin değeri hakkında bildirim ortaya koyar.Ama hata ayıklama istenmediğinde, bildirim ile ifade edilen fonksiyonel bir çağrının durumu olarak yan etkilere sahip olabilidiğinde çekirdeğin bazı kısımları belirsiz durum olmak için BUG_ON'u tanımladığından dolayı onarım yapılmalıdır.Böylece bildirim ifadesi sadece fonksiyonel bir çağrı uygulamadığı durumda BUG ON'u tanıtarak bir kural oluştururuz.
Fonksiyonel bir çağrının formuna sahip olan kodun özel bir parçası, derleyiciyi özel bir ifadenin doğru olamayacağı konusunda bilgilendiren olasılıksızlığın kullanımıdır.Bu durumda olasılıksız hiçbir yan etki göstermediğinden dolayı BUG ON kullanmak güvenlidir.İkinci kural bu durumu sağlar.Bu bir çağrıyı beklenmedik bir şekilde değişkeniyle değiştirmesini sağlayan eşyapılılığı etkisizleştirir.Daha sonra ikinci kural ilki ile aynı olur.\\
\begin{lstlisting}
@@
expression E,f;
@@
(
if (<+... f(...) ...+>) { BUG(); }
|
- if (E) { BUG(); }
+ BUG_ON(E);
)
@ disable unlikely @
expression E,f;
@@
(
if (<+... f(...) ...+>) { BUG(); }
|
- if (unlikely(E)) { BUG(); }
+ BUG_ON(E);
)
\end{lstlisting}
Örneğin yukarıdaki anlamsal yama kullanılarak, Coccinelle aşağıdaki gibi yamalar oluşturur.\\
--- a/fs/ext3/balloc.c
+++ b/fs/ext3/balloc.c
@@ -232,8 +232,7 @@ restart:
prev = rsv;
}
printk("Window map complete.\n");
- if (bad)
- BUG();
+ BUG_ON(bad);
}
#define rsv_window_dump(root, verbose) \
__rsv_window_dump((root), (verbose), __FUNCTION__)
\end{lstlisting}
\end{document}