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