鉴于您提供了一个无法推断的附加参数 (size_t destsz),该参数需要准确才能从更改中受益,您遇到了真正的问题。
一个有 10,000 次使用 strcpy() 的应用程序听起来很疯狂,但你在哪里。
第一
如果您的时间/资源有限,那么我只能建议进行一些风险评估。
哪些调用正在复制外部数据(来自文件、操作系统、用户、端口或套接字等)。
专注于确保那些不会被覆盖,您将更有效地降低风险。
第二
如果您有任何标准变量名称和标准“最大尺寸”,您也许可以进行一些全局搜索和替换。
假设您在您的平台上经常使用filename 并且文件名最多为255 个字符(加上NUL),您可以将strcpy(filename, 替换为(比如说)strcpy_s(filename,FILENAME_MAX_SZ。
如果代码“到处都是”,你就需要做很多工作。
将strcpy(v, 替换为strcpy_s(v,SIZE_MAX(使用正则表达式)是一个肤浅的问题,除了可能潜入您的组织代码质量脚本之外,实际上并没有为您带来任何好处。我没有告诉你这样做! ;)
第三
如果您想在 C11 _Generic 的世界中漫步,您可以尝试以下方式:
#define __STDC_WANT_LIB_EXT1__
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int strcpy_s(char *dest,size_t destsz,const char *src){
if(strlen(src)>=destsz){
return 1;
}
strcpy(dest,src);
return 0;
}
char *d_strcpy(char *dest,const char *src){
#ifndef NDEBUG
fprintf(stdout,"unsafe copy of %s\n",src);
#endif
return strcpy(dest,src);
}
#define strcpy(dest,src) _Generic (dest,\
char[100] : strcpy_s(dest,sizeof dest,src),\
char*: d_strcpy(dest,src)\
)
int main(void) {
char a[100]={'A','B','\0'};
char *b=malloc(10*sizeof(char));
strcpy(a,"XXX");
strcpy(b,"XYX");
printf("%s %s\n",a,b);
free(b);
return 0;
}
不幸的是,您确实需要指定数组大小,因此可能需要使用有限的“最大大小”列表,虽然这应该适用于 Clang(未经测试),但它在 GCC 上失败,因为他们不同意如何解决控制型!见Document: N1930 (controlling expression of _Generic)
狩猎愉快。