162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci///
362306a36Sopenharmony_ci/// Check for opencoded swap() implementation.
462306a36Sopenharmony_ci///
562306a36Sopenharmony_ci// Confidence: High
662306a36Sopenharmony_ci// Copyright: (C) 2021 Denis Efremov ISPRAS
762306a36Sopenharmony_ci// Options: --no-includes --include-headers
862306a36Sopenharmony_ci//
962306a36Sopenharmony_ci// Keywords: swap
1062306a36Sopenharmony_ci//
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_civirtual patch
1362306a36Sopenharmony_civirtual org
1462306a36Sopenharmony_civirtual report
1562306a36Sopenharmony_civirtual context
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci@rvar depends on !patch@
1862306a36Sopenharmony_ciidentifier tmp;
1962306a36Sopenharmony_ciexpression a, b;
2062306a36Sopenharmony_citype T;
2162306a36Sopenharmony_ciposition p;
2262306a36Sopenharmony_ci@@
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci(
2562306a36Sopenharmony_ci* T tmp;
2662306a36Sopenharmony_ci|
2762306a36Sopenharmony_ci* T tmp = 0;
2862306a36Sopenharmony_ci|
2962306a36Sopenharmony_ci* T *tmp = NULL;
3062306a36Sopenharmony_ci)
3162306a36Sopenharmony_ci... when != tmp
3262306a36Sopenharmony_ci* tmp = a;
3362306a36Sopenharmony_ci* a = b;@p
3462306a36Sopenharmony_ci* b = tmp;
3562306a36Sopenharmony_ci... when != tmp
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci@r depends on !patch@
3862306a36Sopenharmony_ciidentifier tmp;
3962306a36Sopenharmony_ciexpression a, b;
4062306a36Sopenharmony_ciposition p != rvar.p;
4162306a36Sopenharmony_ci@@
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci* tmp = a;
4462306a36Sopenharmony_ci* a = b;@p
4562306a36Sopenharmony_ci* b = tmp;
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci@rpvar depends on patch@
4862306a36Sopenharmony_ciidentifier tmp;
4962306a36Sopenharmony_ciexpression a, b;
5062306a36Sopenharmony_citype T;
5162306a36Sopenharmony_ci@@
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci(
5462306a36Sopenharmony_ci- T tmp;
5562306a36Sopenharmony_ci|
5662306a36Sopenharmony_ci- T tmp = 0;
5762306a36Sopenharmony_ci|
5862306a36Sopenharmony_ci- T *tmp = NULL;
5962306a36Sopenharmony_ci)
6062306a36Sopenharmony_ci... when != tmp
6162306a36Sopenharmony_ci- tmp = a;
6262306a36Sopenharmony_ci- a = b;
6362306a36Sopenharmony_ci- b = tmp
6462306a36Sopenharmony_ci+ swap(a, b)
6562306a36Sopenharmony_ci  ;
6662306a36Sopenharmony_ci... when != tmp
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci@rp depends on patch@
6962306a36Sopenharmony_ciidentifier tmp;
7062306a36Sopenharmony_ciexpression a, b;
7162306a36Sopenharmony_ci@@
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci- tmp = a;
7462306a36Sopenharmony_ci- a = b;
7562306a36Sopenharmony_ci- b = tmp
7662306a36Sopenharmony_ci+ swap(a, b)
7762306a36Sopenharmony_ci  ;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci@depends on patch && (rpvar || rp)@
8062306a36Sopenharmony_ci@@
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci(
8362306a36Sopenharmony_ci  for (...;...;...)
8462306a36Sopenharmony_ci- {
8562306a36Sopenharmony_ci	swap(...);
8662306a36Sopenharmony_ci- }
8762306a36Sopenharmony_ci|
8862306a36Sopenharmony_ci  while (...)
8962306a36Sopenharmony_ci- {
9062306a36Sopenharmony_ci	swap(...);
9162306a36Sopenharmony_ci- }
9262306a36Sopenharmony_ci|
9362306a36Sopenharmony_ci  if (...)
9462306a36Sopenharmony_ci- {
9562306a36Sopenharmony_ci	swap(...);
9662306a36Sopenharmony_ci- }
9762306a36Sopenharmony_ci)
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci@script:python depends on report@
10162306a36Sopenharmony_cip << r.p;
10262306a36Sopenharmony_ci@@
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_cicoccilib.report.print_report(p[0], "WARNING opportunity for swap()")
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci@script:python depends on org@
10762306a36Sopenharmony_cip << r.p;
10862306a36Sopenharmony_ci@@
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cicoccilib.org.print_todo(p[0], "WARNING opportunity for swap()")
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci@script:python depends on report@
11362306a36Sopenharmony_cip << rvar.p;
11462306a36Sopenharmony_ci@@
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_cicoccilib.report.print_report(p[0], "WARNING opportunity for swap()")
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci@script:python depends on org@
11962306a36Sopenharmony_cip << rvar.p;
12062306a36Sopenharmony_ci@@
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cicoccilib.org.print_todo(p[0], "WARNING opportunity for swap()")
123