1 // SPDX-License-Identifier: GPL-2.0-only 1 // SPDX-License-Identifier: GPL-2.0-only 2 /// 2 /// 3 /// Check for opencoded swap() implementation. 3 /// Check for opencoded swap() implementation. 4 /// 4 /// 5 // Confidence: High 5 // Confidence: High 6 // Copyright: (C) 2021 Denis Efremov ISPRAS 6 // Copyright: (C) 2021 Denis Efremov ISPRAS 7 // Options: --no-includes --include-headers 7 // Options: --no-includes --include-headers 8 // 8 // 9 // Keywords: swap 9 // Keywords: swap 10 // 10 // 11 11 12 virtual patch 12 virtual patch 13 virtual org 13 virtual org 14 virtual report 14 virtual report 15 virtual context 15 virtual context 16 16 17 @rvar depends on !patch@ 17 @rvar depends on !patch@ 18 identifier tmp; 18 identifier tmp; 19 expression a, b; 19 expression a, b; 20 type T; 20 type T; 21 position p; 21 position p; 22 @@ 22 @@ 23 23 24 ( 24 ( 25 * T tmp; 25 * T tmp; 26 | 26 | 27 * T tmp = 0; 27 * T tmp = 0; 28 | 28 | 29 * T *tmp = NULL; 29 * T *tmp = NULL; 30 ) 30 ) 31 ... when != tmp 31 ... when != tmp 32 * tmp = a; 32 * tmp = a; 33 * a = b;@p 33 * a = b;@p 34 * b = tmp; 34 * b = tmp; 35 ... when != tmp 35 ... when != tmp 36 36 37 @r depends on !patch@ 37 @r depends on !patch@ 38 identifier tmp; 38 identifier tmp; 39 expression a, b; 39 expression a, b; 40 position p != rvar.p; 40 position p != rvar.p; 41 @@ 41 @@ 42 42 43 * tmp = a; 43 * tmp = a; 44 * a = b;@p 44 * a = b;@p 45 * b = tmp; 45 * b = tmp; 46 46 47 @rpvar depends on patch@ 47 @rpvar depends on patch@ 48 identifier tmp; 48 identifier tmp; 49 expression a, b; 49 expression a, b; 50 type T; 50 type T; 51 @@ 51 @@ 52 52 53 ( 53 ( 54 - T tmp; 54 - T tmp; 55 | 55 | 56 - T tmp = 0; 56 - T tmp = 0; 57 | 57 | 58 - T *tmp = NULL; 58 - T *tmp = NULL; 59 ) 59 ) 60 ... when != tmp 60 ... when != tmp 61 - tmp = a; 61 - tmp = a; 62 - a = b; 62 - a = b; 63 - b = tmp 63 - b = tmp 64 + swap(a, b) 64 + swap(a, b) 65 ; 65 ; 66 ... when != tmp 66 ... when != tmp 67 67 68 @rp depends on patch@ 68 @rp depends on patch@ 69 identifier tmp; 69 identifier tmp; 70 expression a, b; 70 expression a, b; 71 @@ 71 @@ 72 72 73 - tmp = a; 73 - tmp = a; 74 - a = b; 74 - a = b; 75 - b = tmp 75 - b = tmp 76 + swap(a, b) 76 + swap(a, b) 77 ; 77 ; 78 78 79 @depends on patch && (rpvar || rp)@ 79 @depends on patch && (rpvar || rp)@ 80 @@ 80 @@ 81 81 82 ( 82 ( 83 for (...;...;...) 83 for (...;...;...) 84 - { 84 - { 85 swap(...); 85 swap(...); 86 - } 86 - } 87 | 87 | 88 while (...) 88 while (...) 89 - { 89 - { 90 swap(...); 90 swap(...); 91 - } 91 - } 92 | 92 | 93 if (...) 93 if (...) 94 - { 94 - { 95 swap(...); 95 swap(...); 96 - } 96 - } 97 ) 97 ) 98 98 99 99 100 @script:python depends on report@ 100 @script:python depends on report@ 101 p << r.p; 101 p << r.p; 102 @@ 102 @@ 103 103 104 coccilib.report.print_report(p[0], "WARNING op 104 coccilib.report.print_report(p[0], "WARNING opportunity for swap()") 105 105 106 @script:python depends on org@ 106 @script:python depends on org@ 107 p << r.p; 107 p << r.p; 108 @@ 108 @@ 109 109 110 coccilib.org.print_todo(p[0], "WARNING opportu 110 coccilib.org.print_todo(p[0], "WARNING opportunity for swap()") 111 111 112 @script:python depends on report@ 112 @script:python depends on report@ 113 p << rvar.p; 113 p << rvar.p; 114 @@ 114 @@ 115 115 116 coccilib.report.print_report(p[0], "WARNING op 116 coccilib.report.print_report(p[0], "WARNING opportunity for swap()") 117 117 118 @script:python depends on org@ 118 @script:python depends on org@ 119 p << rvar.p; 119 p << rvar.p; 120 @@ 120 @@ 121 121 122 coccilib.org.print_todo(p[0], "WARNING opportu 122 coccilib.org.print_todo(p[0], "WARNING opportunity for swap()")
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.