1da9cfb87SWen Yang// SPDX-License-Identifier: GPL-2.0 2da9cfb87SWen Yang/// Find missing put_device for every of_find_device_by_node. 3da9cfb87SWen Yang/// 4da9cfb87SWen Yang// Confidence: Moderate 5da9cfb87SWen Yang// Copyright: (C) 2018-2019 Wen Yang, ZTE. 6da9cfb87SWen Yang// Comments: 7da9cfb87SWen Yang// Options: --no-includes --include-headers 8da9cfb87SWen Yang 9da9cfb87SWen Yangvirtual report 10da9cfb87SWen Yangvirtual org 11da9cfb87SWen Yang 12da9cfb87SWen Yang@search exists@ 13da9cfb87SWen Yanglocal idexpression id; 14da9cfb87SWen Yangexpression x,e,e1; 15da9cfb87SWen Yangposition p1,p2; 16da9cfb87SWen Yangtype T,T1,T2,T3; 17da9cfb87SWen Yang@@ 18da9cfb87SWen Yang 19da9cfb87SWen Yangid = of_find_device_by_node@p1(x) 20da9cfb87SWen Yang... when != e = id 21da9cfb87SWen Yangif (id == NULL || ...) { ... return ...; } 22da9cfb87SWen Yang... when != put_device(&id->dev) 23da9cfb87SWen Yang when != platform_device_put(id) 24da9cfb87SWen Yang when != if (id) { ... put_device(&id->dev) ... } 25da9cfb87SWen Yang when != e1 = (T)id 26*f58c17c2SMarkus Elfring when != e1 = (T)(&id->dev) 27da9cfb87SWen Yang when != e1 = get_device(&id->dev) 28da9cfb87SWen Yang when != e1 = (T1)platform_get_drvdata(id) 29da9cfb87SWen Yang( 30da9cfb87SWen Yang return 31da9cfb87SWen Yang( id 32da9cfb87SWen Yang| (T2)dev_get_drvdata(&id->dev) 33da9cfb87SWen Yang| (T3)platform_get_drvdata(id) 347265f5b7SWen Yang| &id->dev 35da9cfb87SWen Yang); 36da9cfb87SWen Yang| return@p2 ...; 37da9cfb87SWen Yang) 38da9cfb87SWen Yang 39da9cfb87SWen Yang@script:python depends on report@ 40da9cfb87SWen Yangp1 << search.p1; 41da9cfb87SWen Yangp2 << search.p2; 42da9cfb87SWen Yang@@ 43da9cfb87SWen Yang 4430a70e80SMarkus Elfringcoccilib.report.print_report(p2[0], 4530a70e80SMarkus Elfring "ERROR: missing put_device; call of_find_device_by_node on line " 46da9cfb87SWen Yang + p1[0].line 4730a70e80SMarkus Elfring + ", but without a corresponding object release within this function.") 48da9cfb87SWen Yang 49da9cfb87SWen Yang@script:python depends on org@ 50da9cfb87SWen Yangp1 << search.p1; 51da9cfb87SWen Yangp2 << search.p2; 52da9cfb87SWen Yang@@ 53da9cfb87SWen Yang 54da9cfb87SWen Yangcocci.print_main("of_find_device_by_node", p1) 55da9cfb87SWen Yangcocci.print_secs("needed put_device", p2) 56