-
Notifications
You must be signed in to change notification settings - Fork 0
/
bolum14_3.txt
78 lines (61 loc) · 2.78 KB
/
bolum14_3.txt
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
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
@ 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)
)
Üretilmiş Yama Örneği
--- 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;
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.
@@
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);
)
Ö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__)