背景:我有一个使用上载进度的web应用程序,它只是造成了分段错误。调查该问题后,我发现了一个错误报告,该错误报告将问题指向代码https://bugs.php.net/bug.php?id=79584
中的一行在this code中,我还看到,他们使用strcpy。该功能已经在该处使用了很多年,所以我想它已经根据安全规则进行了检查,但是我不是C程序员,我的知识非常有限。我还发现有人提到,有时仍然使用strcpy而不引起任何安全问题有时是合法的。
现在,我想知道这种特殊包装是否如此。该代码是否包含此功能是否安全?
由该提交产生的错误与strcpy
的安全性(或缺乏)完全无关。
strcpy
不安全除非,您可以通过某种方式确保目标对象足够大以容纳源(包括其NUL终止符)。测量源字符串的strlen
并加一个就足以确定所需的长度。此量的malloc
是分配这么多空间的足够方法。在这种程度上,strcpy(malloc(strlen(src) + 1), src)
就像您在C语言中发现的一样安全(除了不为malloc
测试NULL
的返回码而感到不自在;在实际的生产代码中,您应该这样做)。但是,strdup(src)
更加简洁易读,其简洁性使得错别字的可能性降低。就个人而言,我建议在这种情况下always使用strdup
。如果您担心目标平台不包含实现,可以轻松进行填充。