xref: /freebsd-src/sys/contrib/openzfs/.github/codeql/custom-queries/cpp/deprecatedFunctionUsage.ql (revision fd45b686f9d92f583366c75b22c04c7ee49709c0)
1*fd45b686SMartin Matuska/**
2*fd45b686SMartin Matuska * @name Deprecated function usage detection
3*fd45b686SMartin Matuska * @description Detects functions whose usage is banned from the OpenZFS
4*fd45b686SMartin Matuska *              codebase due to QA concerns.
5*fd45b686SMartin Matuska * @kind problem
6*fd45b686SMartin Matuska * @severity error
7*fd45b686SMartin Matuska * @id cpp/deprecated-function-usage
8*fd45b686SMartin Matuska*/
9*fd45b686SMartin Matuska
10*fd45b686SMartin Matuskaimport cpp
11*fd45b686SMartin Matuska
12*fd45b686SMartin Matuskapredicate isDeprecatedFunction(Function f) {
13*fd45b686SMartin Matuska  f.getName() = "strtok" or
14*fd45b686SMartin Matuska  f.getName() = "__xpg_basename" or
15*fd45b686SMartin Matuska  f.getName() = "basename" or
16*fd45b686SMartin Matuska  f.getName() = "dirname" or
17*fd45b686SMartin Matuska  f.getName() = "bcopy" or
18*fd45b686SMartin Matuska  f.getName() = "bcmp" or
19*fd45b686SMartin Matuska  f.getName() = "bzero" or
20*fd45b686SMartin Matuska  f.getName() = "asctime" or
21*fd45b686SMartin Matuska  f.getName() = "asctime_r" or
22*fd45b686SMartin Matuska  f.getName() = "gmtime" or
23*fd45b686SMartin Matuska  f.getName() = "localtime" or
24*fd45b686SMartin Matuska  f.getName() = "strncpy"
25*fd45b686SMartin Matuska
26*fd45b686SMartin Matuska}
27*fd45b686SMartin Matuska
28*fd45b686SMartin Matuskastring getReplacementMessage(Function f) {
29*fd45b686SMartin Matuska  if f.getName() = "strtok" then
30*fd45b686SMartin Matuska    result = "Use strtok_r(3) instead!"
31*fd45b686SMartin Matuska  else if f.getName() = "__xpg_basename" then
32*fd45b686SMartin Matuska    result = "basename(3) is underspecified. Use zfs_basename() instead!"
33*fd45b686SMartin Matuska  else if f.getName() = "basename" then
34*fd45b686SMartin Matuska    result = "basename(3) is underspecified. Use zfs_basename() instead!"
35*fd45b686SMartin Matuska  else if f.getName() = "dirname" then
36*fd45b686SMartin Matuska    result = "dirname(3) is underspecified. Use zfs_dirnamelen() instead!"
37*fd45b686SMartin Matuska  else if f.getName() = "bcopy" then
38*fd45b686SMartin Matuska    result = "bcopy(3) is deprecated. Use memcpy(3)/memmove(3) instead!"
39*fd45b686SMartin Matuska  else if f.getName() = "bcmp" then
40*fd45b686SMartin Matuska    result = "bcmp(3) is deprecated. Use memcmp(3) instead!"
41*fd45b686SMartin Matuska  else if f.getName() = "bzero" then
42*fd45b686SMartin Matuska    result = "bzero(3) is deprecated. Use memset(3) instead!"
43*fd45b686SMartin Matuska  else if f.getName() = "asctime" then
44*fd45b686SMartin Matuska    result = "Use strftime(3) instead!"
45*fd45b686SMartin Matuska  else if f.getName() = "asctime_r" then
46*fd45b686SMartin Matuska    result = "Use strftime(3) instead!"
47*fd45b686SMartin Matuska  else if f.getName() = "gmtime" then
48*fd45b686SMartin Matuska    result = "gmtime(3) isn't thread-safe. Use gmtime_r(3) instead!"
49*fd45b686SMartin Matuska  else if f.getName() = "localtime" then
50*fd45b686SMartin Matuska    result = "localtime(3) isn't thread-safe. Use localtime_r(3) instead!"
51*fd45b686SMartin Matuska  else
52*fd45b686SMartin Matuska    result = "strncpy(3) is deprecated. Use strlcpy(3) instead!"
53*fd45b686SMartin Matuska}
54*fd45b686SMartin Matuska
55*fd45b686SMartin Matuskafrom FunctionCall fc, Function f
56*fd45b686SMartin Matuskawhere
57*fd45b686SMartin Matuska  fc.getTarget() = f and
58*fd45b686SMartin Matuska  isDeprecatedFunction(f)
59*fd45b686SMartin Matuskaselect fc, getReplacementMessage(f)
60