如何找到src和amp;之间的重叠str的str(和类似的功能)

时间:2015-07-19 14:24:14

标签: gcc overlap memcpy strcpy

假设我有很多strcpy,strcat和amp; memcpy在我们的项目中(一个非常大的!)。  如何轻松检测源指针和目标指针之间重叠的所有位置。

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

是否有人知道gcc强化是否可以为此问题提供解决方案? 或者除了包装这些功能之外还有其他想法并自己检查一下?

2 个答案:

答案 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之后永远不要包含任何系统标头。在这些代码之前,所有需要的系统标头都应该是#include d。

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

答案 1 :(得分:0)

即使在运行时检查也只是告诉你运行 s far 的测试不会产生重叠的字符串。

另一种方法是不用担心,只需将每个memcpy更改为memmove,将每个strcpy(d,s)更改为memmove(d,s,strlen(s)+1)(当然可以将其更改为perl在内联函数中)。在大多数情况下,性能差异可以忽略不计。这应该花费你整整5分钟$fields,这将比使用乐器或理解每个电话更有效地利用时间。