2015-07-19 48 views
0

假设我在我们的项目中有很多strcpy,strcat & memcpy的外观(一个非常大的!)。 如何轻松检测到源和目标指针之间有重叠的地方。如何找到strcpy中的src&dest与类似函数之间的重叠

我知道valgrind可以做到这一点,但并不是所有的情况都可以在vilgrind运行时检测到(有很多可能的流程)。

确实有人知道gcc强化是否可以为这个问题提供解决方案? 或者其他想法,除了包装这些功能,并自己检查它?

+0

没有任何方法可以静态查找所有这类潜在的问题。 –

回答

0

你可以编写一个包装来动态检查它们。

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后面不要包含任何系统头文件。在这些代码之前,所有需要的系统标题应该是#included。

不可能静态检查,因为编译器不知道这些指针的运行时间值。

0

即使在运行时检查也只会告诉您,您运行的测试的远端不会产生重叠的字符串。

另一种办法是不要担心,并简单地改变每个memcpymemmove,每strcpy(d,s)memmove(d,s,strlen(s)+1)(这当然可以被放置在一个内联函数)。在大多数情况下,性能差异可以忽略不计。这应该花费你整整5分钟的时间与perl相比,这将是一个更有效率的使用时间比仪表批或理解每个电话。