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