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