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