假设我在我们的项目中有很多strcpy,strcat & memcpy的外观(一个非常大的!)。 如何轻松检测到源和目标指针之间有重叠的地方。如何找到strcpy中的src&dest与类似函数之间的重叠
我知道valgrind可以做到这一点,但并不是所有的情况都可以在vilgrind运行时检测到(有很多可能的流程)。
确实有人知道gcc强化是否可以为这个问题提供解决方案? 或者其他想法,除了包装这些功能,并自己检查它?
假设我在我们的项目中有很多strcpy,strcat & memcpy的外观(一个非常大的!)。 如何轻松检测到源和目标指针之间有重叠的地方。如何找到strcpy中的src&dest与类似函数之间的重叠
我知道valgrind可以做到这一点,但并不是所有的情况都可以在vilgrind运行时检测到(有很多可能的流程)。
确实有人知道gcc强化是否可以为这个问题提供解决方案? 或者其他想法,除了包装这些功能,并自己检查它?
你可以编写一个包装来动态检查它们。
void *memcpy_check(void *dest, const void *src, size_t n)
{
// Code to examine whether dest and src overlap.
// If overlap, abort() or report error.
memcpy(dest, src, n);
}
#define memcpy memcpy_check
警告在行#define
后面不要包含任何系统头文件。在这些代码之前,所有需要的系统标题应该是#include
d。
不可能静态检查,因为编译器不知道这些指针的运行时间值。
即使在运行时检查也只会告诉您,您运行的测试的远端不会产生重叠的字符串。
另一种办法是不要担心,并简单地改变每个memcpy
到memmove
,每strcpy(d,s)
到memmove(d,s,strlen(s)+1)
(这当然可以被放置在一个内联函数)。在大多数情况下,性能差异可以忽略不计。这应该花费你整整5分钟的时间与perl
相比,这将是一个更有效率的使用时间比仪表批或理解每个电话。
没有任何方法可以静态查找所有这类潜在的问题。 –