162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/// 362306a36Sopenharmony_ci/// Check for opencoded min(), max() implementations. 462306a36Sopenharmony_ci/// Generated patches sometimes require adding a cast to fix compile warning. 562306a36Sopenharmony_ci/// Warnings/patches scope intentionally limited to a function body. 662306a36Sopenharmony_ci/// 762306a36Sopenharmony_ci// Confidence: Medium 862306a36Sopenharmony_ci// Copyright: (C) 2021 Denis Efremov ISPRAS 962306a36Sopenharmony_ci// Options: --no-includes --include-headers 1062306a36Sopenharmony_ci// 1162306a36Sopenharmony_ci// Keywords: min, max 1262306a36Sopenharmony_ci// 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_civirtual report 1662306a36Sopenharmony_civirtual org 1762306a36Sopenharmony_civirtual context 1862306a36Sopenharmony_civirtual patch 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci@rmax depends on !patch@ 2162306a36Sopenharmony_ciidentifier func; 2262306a36Sopenharmony_ciexpression x, y; 2362306a36Sopenharmony_cibinary operator cmp = {>, >=}; 2462306a36Sopenharmony_ciposition p; 2562306a36Sopenharmony_ci@@ 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_cifunc(...) 2862306a36Sopenharmony_ci{ 2962306a36Sopenharmony_ci <... 3062306a36Sopenharmony_ci* ((x) cmp@p (y) ? (x) : (y)) 3162306a36Sopenharmony_ci ...> 3262306a36Sopenharmony_ci} 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci@rmaxif depends on !patch@ 3562306a36Sopenharmony_ciidentifier func; 3662306a36Sopenharmony_ciexpression x, y; 3762306a36Sopenharmony_ciexpression max_val; 3862306a36Sopenharmony_cibinary operator cmp = {>, >=}; 3962306a36Sopenharmony_ciposition p; 4062306a36Sopenharmony_ci@@ 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cifunc(...) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci <... 4562306a36Sopenharmony_ci* if ((x) cmp@p (y)) { 4662306a36Sopenharmony_ci* max_val = (x); 4762306a36Sopenharmony_ci* } else { 4862306a36Sopenharmony_ci* max_val = (y); 4962306a36Sopenharmony_ci* } 5062306a36Sopenharmony_ci ...> 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci@rmin depends on !patch@ 5462306a36Sopenharmony_ciidentifier func; 5562306a36Sopenharmony_ciexpression x, y; 5662306a36Sopenharmony_cibinary operator cmp = {<, <=}; 5762306a36Sopenharmony_ciposition p; 5862306a36Sopenharmony_ci@@ 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cifunc(...) 6162306a36Sopenharmony_ci{ 6262306a36Sopenharmony_ci <... 6362306a36Sopenharmony_ci* ((x) cmp@p (y) ? (x) : (y)) 6462306a36Sopenharmony_ci ...> 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci@rminif depends on !patch@ 6862306a36Sopenharmony_ciidentifier func; 6962306a36Sopenharmony_ciexpression x, y; 7062306a36Sopenharmony_ciexpression min_val; 7162306a36Sopenharmony_cibinary operator cmp = {<, <=}; 7262306a36Sopenharmony_ciposition p; 7362306a36Sopenharmony_ci@@ 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cifunc(...) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci <... 7862306a36Sopenharmony_ci* if ((x) cmp@p (y)) { 7962306a36Sopenharmony_ci* min_val = (x); 8062306a36Sopenharmony_ci* } else { 8162306a36Sopenharmony_ci* min_val = (y); 8262306a36Sopenharmony_ci* } 8362306a36Sopenharmony_ci ...> 8462306a36Sopenharmony_ci} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci@pmax depends on patch@ 8762306a36Sopenharmony_ciidentifier func; 8862306a36Sopenharmony_ciexpression x, y; 8962306a36Sopenharmony_cibinary operator cmp = {>=, >}; 9062306a36Sopenharmony_ci@@ 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cifunc(...) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci <... 9562306a36Sopenharmony_ci- ((x) cmp (y) ? (x) : (y)) 9662306a36Sopenharmony_ci+ max(x, y) 9762306a36Sopenharmony_ci ...> 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci@pmaxif depends on patch@ 10162306a36Sopenharmony_ciidentifier func; 10262306a36Sopenharmony_ciexpression x, y; 10362306a36Sopenharmony_ciexpression max_val; 10462306a36Sopenharmony_cibinary operator cmp = {>=, >}; 10562306a36Sopenharmony_ci@@ 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cifunc(...) 10862306a36Sopenharmony_ci{ 10962306a36Sopenharmony_ci <... 11062306a36Sopenharmony_ci- if ((x) cmp (y)) { 11162306a36Sopenharmony_ci- max_val = x; 11262306a36Sopenharmony_ci- } else { 11362306a36Sopenharmony_ci- max_val = y; 11462306a36Sopenharmony_ci- } 11562306a36Sopenharmony_ci+ max_val = max(x, y); 11662306a36Sopenharmony_ci ...> 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci// Don't generate patches for errcode returns. 12062306a36Sopenharmony_ci@errcode depends on patch@ 12162306a36Sopenharmony_ciposition p; 12262306a36Sopenharmony_ciidentifier func; 12362306a36Sopenharmony_ciexpression x; 12462306a36Sopenharmony_cibinary operator cmp = {<, <=}; 12562306a36Sopenharmony_ci@@ 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_cifunc(...) 12862306a36Sopenharmony_ci{ 12962306a36Sopenharmony_ci <... 13062306a36Sopenharmony_ci return ((x) cmp@p 0 ? (x) : 0); 13162306a36Sopenharmony_ci ...> 13262306a36Sopenharmony_ci} 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci@pmin depends on patch@ 13562306a36Sopenharmony_ciidentifier func; 13662306a36Sopenharmony_ciexpression x, y; 13762306a36Sopenharmony_cibinary operator cmp = {<=, <}; 13862306a36Sopenharmony_ciposition p != errcode.p; 13962306a36Sopenharmony_ci@@ 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cifunc(...) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci <... 14462306a36Sopenharmony_ci- ((x) cmp@p (y) ? (x) : (y)) 14562306a36Sopenharmony_ci+ min(x, y) 14662306a36Sopenharmony_ci ...> 14762306a36Sopenharmony_ci} 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci@pminif depends on patch@ 15062306a36Sopenharmony_ciidentifier func; 15162306a36Sopenharmony_ciexpression x, y; 15262306a36Sopenharmony_ciexpression min_val; 15362306a36Sopenharmony_cibinary operator cmp = {<=, <}; 15462306a36Sopenharmony_ci@@ 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cifunc(...) 15762306a36Sopenharmony_ci{ 15862306a36Sopenharmony_ci <... 15962306a36Sopenharmony_ci- if ((x) cmp (y)) { 16062306a36Sopenharmony_ci- min_val = x; 16162306a36Sopenharmony_ci- } else { 16262306a36Sopenharmony_ci- min_val = y; 16362306a36Sopenharmony_ci- } 16462306a36Sopenharmony_ci+ min_val = min(x, y); 16562306a36Sopenharmony_ci ...> 16662306a36Sopenharmony_ci} 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci@script:python depends on report@ 16962306a36Sopenharmony_cip << rmax.p; 17062306a36Sopenharmony_ci@@ 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_cifor p0 in p: 17362306a36Sopenharmony_ci coccilib.report.print_report(p0, "WARNING opportunity for max()") 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci@script:python depends on org@ 17662306a36Sopenharmony_cip << rmax.p; 17762306a36Sopenharmony_ci@@ 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cifor p0 in p: 18062306a36Sopenharmony_ci coccilib.org.print_todo(p0, "WARNING opportunity for max()") 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci@script:python depends on report@ 18362306a36Sopenharmony_cip << rmaxif.p; 18462306a36Sopenharmony_ci@@ 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_cifor p0 in p: 18762306a36Sopenharmony_ci coccilib.report.print_report(p0, "WARNING opportunity for max()") 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci@script:python depends on org@ 19062306a36Sopenharmony_cip << rmaxif.p; 19162306a36Sopenharmony_ci@@ 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_cifor p0 in p: 19462306a36Sopenharmony_ci coccilib.org.print_todo(p0, "WARNING opportunity for max()") 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci@script:python depends on report@ 19762306a36Sopenharmony_cip << rmin.p; 19862306a36Sopenharmony_ci@@ 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_cifor p0 in p: 20162306a36Sopenharmony_ci coccilib.report.print_report(p0, "WARNING opportunity for min()") 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_ci@script:python depends on org@ 20462306a36Sopenharmony_cip << rmin.p; 20562306a36Sopenharmony_ci@@ 20662306a36Sopenharmony_ci 20762306a36Sopenharmony_cifor p0 in p: 20862306a36Sopenharmony_ci coccilib.org.print_todo(p0, "WARNING opportunity for min()") 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci@script:python depends on report@ 21162306a36Sopenharmony_cip << rminif.p; 21262306a36Sopenharmony_ci@@ 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_cifor p0 in p: 21562306a36Sopenharmony_ci coccilib.report.print_report(p0, "WARNING opportunity for min()") 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci@script:python depends on org@ 21862306a36Sopenharmony_cip << rminif.p; 21962306a36Sopenharmony_ci@@ 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cifor p0 in p: 22262306a36Sopenharmony_ci coccilib.org.print_todo(p0, "WARNING opportunity for min()") 223