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