1/// 2/// Use zeroing allocator rather than allocator followed by memset with 0 3/// 4/// This considers some simple cases that are common and easy to validate 5/// Note in particular that there are no ...s in the rule, so all of the 6/// matched code has to be contiguous 7/// 8// Confidence: High 9// Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU. GPLv2. 10// Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6. GPLv2. 11// Copyright: (C) 2017 Himanshu Jha GPLv2. 12// URL: http://coccinelle.lip6.fr/rules/kzalloc.html 13// Options: --no-includes --include-headers 14// 15// Keywords: kmalloc, kzalloc 16// Version min: < 2.6.12 kmalloc 17// Version min: 2.6.14 kzalloc 18// 19 20virtual context 21virtual patch 22virtual org 23virtual report 24 25//---------------------------------------------------------- 26// For context mode 27//---------------------------------------------------------- 28 29@depends on context@ 30type T, T2; 31expression x; 32expression E1; 33statement S; 34@@ 35 36* x = (T)\(kmalloc(E1, ...)\|vmalloc(E1)\|dma_alloc_coherent(...,E1,...)\| 37 kmalloc_node(E1, ...)\|kmem_cache_alloc(...)\|kmem_alloc(E1, ...)\| 38 devm_kmalloc(...,E1,...)\|kvmalloc(E1, ...)\|pci_alloc_consistent(...,E1,...)\| 39 kvmalloc_node(E1,...)\); 40 if ((x==NULL) || ...) S 41* memset((T2)x,0,E1); 42 43//---------------------------------------------------------- 44// For patch mode 45//---------------------------------------------------------- 46 47@depends on patch@ 48type T, T2; 49expression x; 50expression E1,E2,E3,E4; 51statement S; 52@@ 53 54( 55- x = kmalloc(E1,E2); 56+ x = kzalloc(E1,E2); 57| 58- x = (T *)kmalloc(E1,E2); 59+ x = kzalloc(E1,E2); 60| 61- x = (T)kmalloc(E1,E2); 62+ x = (T)kzalloc(E1,E2); 63| 64- x = vmalloc(E1); 65+ x = vzalloc(E1); 66| 67- x = (T *)vmalloc(E1); 68+ x = vzalloc(E1); 69| 70- x = (T)vmalloc(E1); 71+ x = (T)vzalloc(E1); 72| 73- x = dma_alloc_coherent(E2,E1,E3,E4); 74+ x = dma_zalloc_coherent(E2,E1,E3,E4); 75| 76- x = (T *)dma_alloc_coherent(E2,E1,E3,E4); 77+ x = dma_zalloc_coherent(E2,E1,E3,E4); 78| 79- x = (T)dma_alloc_coherent(E2,E1,E3,E4); 80+ x = (T)dma_zalloc_coherent(E2,E1,E3,E4); 81| 82- x = kmalloc_node(E1,E2,E3); 83+ x = kzalloc_node(E1,E2,E3); 84| 85- x = (T *)kmalloc_node(E1,E2,E3); 86+ x = kzalloc_node(E1,E2,E3); 87| 88- x = (T)kmalloc_node(E1,E2,E3); 89+ x = (T)kzalloc_node(E1,E2,E3); 90| 91- x = kmem_cache_alloc(E3,E4); 92+ x = kmem_cache_zalloc(E3,E4); 93| 94- x = (T *)kmem_cache_alloc(E3,E4); 95+ x = kmem_cache_zalloc(E3,E4); 96| 97- x = (T)kmem_cache_alloc(E3,E4); 98+ x = (T)kmem_cache_zalloc(E3,E4); 99| 100- x = kmem_alloc(E1,E2); 101+ x = kmem_zalloc(E1,E2); 102| 103- x = (T *)kmem_alloc(E1,E2); 104+ x = kmem_zalloc(E1,E2); 105| 106- x = (T)kmem_alloc(E1,E2); 107+ x = (T)kmem_zalloc(E1,E2); 108| 109- x = devm_kmalloc(E2,E1,E3); 110+ x = devm_kzalloc(E2,E1,E3); 111| 112- x = (T *)devm_kmalloc(E2,E1,E3); 113+ x = devm_kzalloc(E2,E1,E3); 114| 115- x = (T)devm_kmalloc(E2,E1,E3); 116+ x = (T)devm_kzalloc(E2,E1,E3); 117| 118- x = kvmalloc(E1,E2); 119+ x = kvzalloc(E1,E2); 120| 121- x = (T *)kvmalloc(E1,E2); 122+ x = kvzalloc(E1,E2); 123| 124- x = (T)kvmalloc(E1,E2); 125+ x = (T)kvzalloc(E1,E2); 126| 127- x = pci_alloc_consistent(E2,E1,E3); 128+ x = pci_zalloc_consistent(E2,E1,E3); 129| 130- x = (T *)pci_alloc_consistent(E2,E1,E3); 131+ x = pci_zalloc_consistent(E2,E1,E3); 132| 133- x = (T)pci_alloc_consistent(E2,E1,E3); 134+ x = (T)pci_zalloc_consistent(E2,E1,E3); 135| 136- x = kvmalloc_node(E1,E2,E3); 137+ x = kvzalloc_node(E1,E2,E3); 138| 139- x = (T *)kvmalloc_node(E1,E2,E3); 140+ x = kvzalloc_node(E1,E2,E3); 141| 142- x = (T)kvmalloc_node(E1,E2,E3); 143+ x = (T)kvzalloc_node(E1,E2,E3); 144) 145 if ((x==NULL) || ...) S 146- memset((T2)x,0,E1); 147 148//---------------------------------------------------------- 149// For org mode 150//---------------------------------------------------------- 151 152@r depends on org || report@ 153type T, T2; 154expression x; 155expression E1,E2; 156statement S; 157position p; 158@@ 159 160 x = (T)kmalloc@p(E1,E2); 161 if ((x==NULL) || ...) S 162 memset((T2)x,0,E1); 163 164@script:python depends on org@ 165p << r.p; 166x << r.x; 167@@ 168 169msg="%s" % (x) 170msg_safe=msg.replace("[","@(").replace("]",")") 171coccilib.org.print_todo(p[0], msg_safe) 172 173@script:python depends on report@ 174p << r.p; 175x << r.x; 176@@ 177 178msg="WARNING: kzalloc should be used for %s, instead of kmalloc/memset" % (x) 179coccilib.report.print_report(p[0], msg) 180 181//----------------------------------------------------------------- 182@r1 depends on org || report@ 183type T, T2; 184expression x; 185expression E1; 186statement S; 187position p; 188@@ 189 190 x = (T)vmalloc@p(E1); 191 if ((x==NULL) || ...) S 192 memset((T2)x,0,E1); 193 194@script:python depends on org@ 195p << r1.p; 196x << r1.x; 197@@ 198 199msg="%s" % (x) 200msg_safe=msg.replace("[","@(").replace("]",")") 201coccilib.org.print_todo(p[0], msg_safe) 202 203@script:python depends on report@ 204p << r1.p; 205x << r1.x; 206@@ 207 208msg="WARNING: vzalloc should be used for %s, instead of vmalloc/memset" % (x) 209coccilib.report.print_report(p[0], msg) 210 211//----------------------------------------------------------------- 212@r2 depends on org || report@ 213type T, T2; 214expression x; 215expression E1,E2,E3,E4; 216statement S; 217position p; 218@@ 219 220 x = (T)dma_alloc_coherent@p(E2,E1,E3,E4); 221 if ((x==NULL) || ...) S 222 memset((T2)x,0,E1); 223 224@script:python depends on org@ 225p << r2.p; 226x << r2.x; 227@@ 228 229msg="%s" % (x) 230msg_safe=msg.replace("[","@(").replace("]",")") 231coccilib.org.print_todo(p[0], msg_safe) 232 233@script:python depends on report@ 234p << r2.p; 235x << r2.x; 236@@ 237 238msg="WARNING: dma_zalloc_coherent should be used for %s, instead of dma_alloc_coherent/memset" % (x) 239coccilib.report.print_report(p[0], msg) 240 241//----------------------------------------------------------------- 242@r3 depends on org || report@ 243type T, T2; 244expression x; 245expression E1,E2,E3; 246statement S; 247position p; 248@@ 249 250 x = (T)kmalloc_node@p(E1,E2,E3); 251 if ((x==NULL) || ...) S 252 memset((T2)x,0,E1); 253 254@script:python depends on org@ 255p << r3.p; 256x << r3.x; 257@@ 258 259msg="%s" % (x) 260msg_safe=msg.replace("[","@(").replace("]",")") 261coccilib.org.print_todo(p[0], msg_safe) 262 263@script:python depends on report@ 264p << r3.p; 265x << r3.x; 266@@ 267 268msg="WARNING: kzalloc_node should be used for %s, instead of kmalloc_node/memset" % (x) 269coccilib.report.print_report(p[0], msg) 270 271//----------------------------------------------------------------- 272@r4 depends on org || report@ 273type T, T2; 274expression x; 275expression E1,E2,E3; 276statement S; 277position p; 278@@ 279 280 x = (T)kmem_cache_alloc@p(E2,E3); 281 if ((x==NULL) || ...) S 282 memset((T2)x,0,E1); 283 284@script:python depends on org@ 285p << r4.p; 286x << r4.x; 287@@ 288 289msg="%s" % (x) 290msg_safe=msg.replace("[","@(").replace("]",")") 291coccilib.org.print_todo(p[0], msg_safe) 292 293@script:python depends on report@ 294p << r4.p; 295x << r4.x; 296@@ 297 298msg="WARNING: kmem_cache_zalloc should be used for %s, instead of kmem_cache_alloc/memset" % (x) 299coccilib.report.print_report(p[0], msg) 300 301//----------------------------------------------------------------- 302@r5 depends on org || report@ 303type T, T2; 304expression x; 305expression E1,E2; 306statement S; 307position p; 308@@ 309 310 x = (T)kmem_alloc@p(E1,E2); 311 if ((x==NULL) || ...) S 312 memset((T2)x,0,E1); 313 314@script:python depends on org@ 315p << r5.p; 316x << r5.x; 317@@ 318 319msg="%s" % (x) 320msg_safe=msg.replace("[","@(").replace("]",")") 321coccilib.org.print_todo(p[0], msg_safe) 322 323@script:python depends on report@ 324p << r5.p; 325x << r5.x; 326@@ 327 328msg="WARNING: kmem_zalloc should be used for %s, instead of kmem_alloc/memset" % (x) 329coccilib.report.print_report(p[0], msg) 330 331//----------------------------------------------------------------- 332@r6 depends on org || report@ 333type T, T2; 334expression x; 335expression E1,E2,E3; 336statement S; 337position p; 338@@ 339 340 x = (T)devm_kmalloc@p(E2,E1,E3); 341 if ((x==NULL) || ...) S 342 memset((T2)x,0,E1); 343 344@script:python depends on org@ 345p << r6.p; 346x << r6.x; 347@@ 348 349msg="%s" % (x) 350msg_safe=msg.replace("[","@(").replace("]",")") 351coccilib.org.print_todo(p[0], msg_safe) 352 353@script:python depends on report@ 354p << r6.p; 355x << r6.x; 356@@ 357 358msg="WARNING: devm_kzalloc should be used for %s, instead of devm_kmalloc/memset" % (x) 359coccilib.report.print_report(p[0], msg) 360 361//----------------------------------------------------------------- 362@r7 depends on org || report@ 363type T, T2; 364expression x; 365expression E1,E2; 366statement S; 367position p; 368@@ 369 370 x = (T)kvmalloc@p(E1,E2); 371 if ((x==NULL) || ...) S 372 memset((T2)x,0,E1); 373 374@script:python depends on org@ 375p << r7.p; 376x << r7.x; 377@@ 378 379msg="%s" % (x) 380msg_safe=msg.replace("[","@(").replace("]",")") 381coccilib.org.print_todo(p[0], msg_safe) 382 383@script:python depends on report@ 384p << r7.p; 385x << r7.x; 386@@ 387 388msg="WARNING: kvzalloc should be used for %s, instead of kvmalloc/memset" % (x) 389coccilib.report.print_report(p[0], msg) 390 391//----------------------------------------------------------------- 392@r8 depends on org || report@ 393type T, T2; 394expression x; 395expression E1,E2,E3; 396statement S; 397position p; 398@@ 399 400 x = (T)pci_alloc_consistent@p(E2,E1,E3); 401 if ((x==NULL) || ...) S 402 memset((T2)x,0,E1); 403 404@script:python depends on org@ 405p << r8.p; 406x << r8.x; 407@@ 408 409msg="%s" % (x) 410msg_safe=msg.replace("[","@(").replace("]",")") 411coccilib.org.print_todo(p[0], msg_safe) 412 413@script:python depends on report@ 414p << r8.p; 415x << r8.x; 416@@ 417 418msg="WARNING: pci_zalloc_consistent should be used for %s, instead of pci_alloc_consistent/memset" % (x) 419coccilib.report.print_report(p[0], msg) 420//----------------------------------------------------------------- 421@r9 depends on org || report@ 422type T, T2; 423expression x; 424expression E1,E2,E3; 425statement S; 426position p; 427@@ 428 429 x = (T)kvmalloc_node@p(E1,E2,E3); 430 if ((x==NULL) || ...) S 431 memset((T2)x,0,E1); 432 433@script:python depends on org@ 434p << r9.p; 435x << r9.x; 436@@ 437 438msg="%s" % (x) 439msg_safe=msg.replace("[","@(").replace("]",")") 440coccilib.org.print_todo(p[0], msg_safe) 441 442@script:python depends on report@ 443p << r9.p; 444x << r9.x; 445@@ 446 447msg="WARNING: kvzalloc_node should be used for %s, instead of kvmalloc_node/memset" % (x) 448coccilib.report.print_report(p[0], msg) 449