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