-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbolum14_5.txt
78 lines (63 loc) · 3.76 KB
/
bolum14_5.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
14.5 gönderi sayacı:the of_xxx API
Coccinelle Python kodunu gömebilirsiniz.Python kodu açıklamalı özel SMPL kural içinde script:python ile kullanılır. Python kuralları diğer SMPL kuralları gibi tanımlayıcı veya belirteç pozisyonları gibi meta değişkenleri miras alır.Kalıtsal meta değişkenler sonra Python kodu tarafından ayarlanabilir.Aşağıdaki semantik eşleşme "of_find_node_by_name" işlevine bir çağrı yapar.Bu çağrının kaynağı serbest bırakmak için azaltmış olması gereken bir sayacı artırır.Sonra, ne zaman "of_node_put" çağrısı yoksa,"device_node" değişken "n" ve "return" ifadesi hiçbir yeni atamaya ulaşmadığında , hata tespit edildiğinde konuma "p1" ve "P2" ilk değeri verilir.Python konumlarımızı sadece p1 ve p2 bağlı olduğu için, bu değerlendirilir.Aşağıdaki durumda, bazı Emacs Org modu veri üretilmektedir.Bu örnek, bir konum değişkeninde Python kodunun erişilebilinen çeşitli alanlarını göstermektedir.
1 @ r exists @
2 local idexpression struct device_node *n;
3 position p1, p2;
4 statement S1,S2;
5 expression E,E1;
6 @@
7
8 (
9 if (!(n@p1 = of_find_node_by_name(...))) S1
10 |
11 n@p1 = of_find_node_by_name(...)
12 )
13 <... when != of_node_put(n)
14 when != if (...) { <+... of_node_put(n) ...+> }
15 when != true !n || ...
16 when != n = E
17 when != E = n
18 if (!n || ...) S2
19 ...>
20 (
21 return <+...n...+>;
22 |
23 return@p2 ...;
24 |
25 n = E1
26 |
27 E1 = n
28 )
29
30 @ script:python @
31 p1 << r.p1;
32 p2 << r.p2;
33 @@
34
35 print "* TODO [[view:%s::face=ovl-face1::linb=%s::colb=%s::cole=%s][inc.
counter:%s::%s]]" % (p1[0].file,p1[0].line,p1[0].column,p1[0].column_end,
p1[0].file,p1[0].line)
36 print "[[view:%s::face=ovl-face2::linb=%s::colb=%s::cole=%s][return]]" % (p2
[0].file,p2[0].line,p2[0].column,p2[0].column_end)
13 ile 17. satırlar arasında "of_find_node_by_name" çağrısı ve bir hata görünmemesi gereken yapıların çeşitleri listelenmektedir.Örnekler of_node_put(13.) bir çağrı ve n null(15.) olup olmadığının bir koşullu testten sonra şube içine bir geçişi vardır.n NULL olup olmadığını test koşulları herhangi bir sayıda yuva kullanımını tarafından belirtildiği şekilde izin verilen <...... > of_find_node_by_name çağrısı arasındaki yolda dönüş ve desen koşullu satır 18 açıklamıştır.
Daha önce semantik eşleşme aşağıdaki satırları oluşturmak için kullanılmıştır.Kod bir siteden diğerine gitmek için emacs Org modu kullanılarak düzenlenebilir.
1 * TODO [[view:/linux-next/arch/powerpc/platforms/pseries/setup.c::face=ovl-
face1::linb=236::colb=18::cole=20][inc. counter:/linux-next/arch/powerpc/
platforms/pseries/setup.c::236]]
2 [[view:/linux-next/arch/powerpc/platforms/pseries/setup.c::face=ovl-face2::
linb=250::colb=3::cole=9][return]]
3 * TODO [[view:/linux-next/arch/powerpc/platforms/pseries/setup.c::face=ovl-
face1::linb=236::colb=18::cole=20][inc. counter:/linux-next/arch/powerpc/
platforms/pseries/setup.c::236]]
4 [[view:/linux-next/arch/powerpc/platforms/pseries/setup.c::face=ovl-face2::
linb=245::colb=3::cole=9][return]]
Not: Coccinelle, yani "cocci.print_main, cocci.print_sec" ve "cocci.print_secs" bazı önceden tanımlanmış Python fonksiyonları sağlar.Bir alternatif olarak yerine önceden sunulan aşağıdaki SMPL kurallarından birini yazabilirsiniz.
1 @ script:python @
2 p1 << r.p1;
3 p2 << r.p2;
4 @@
5
6 cocci.print_main(p1)
7 cocci.print_sec(p2,"return")
İşlev cocci.print_secs bir tek uyumlu olan birkaç konum olduğunda kullanılır.
Her meta değişkeni Python kodu alabiliyordu.Ancak, erişilebilir alanlar şu anda eşit olarak aralarında desteklenmez.