假设我有很多strcpy,strcat和amp; memcpy在我们的项目中(一个非常大的!)。 如何轻松检测源指针和目标指针之间重叠的所有位置。
我知道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
之后永远不要包含任何系统标头。在这些代码之前,所有需要的系统标头都应该是#include
d。
静态检查是不可能的,因为编译器不知道这些指针的运行时值。
答案 1 :(得分:0)
即使在运行时检查也只是告诉你运行 s far 的测试不会产生重叠的字符串。
另一种方法是不用担心,只需将每个memcpy
更改为memmove
,将每个strcpy(d,s)
更改为memmove(d,s,strlen(s)+1)
(当然可以将其更改为perl
在内联函数中)。在大多数情况下,性能差异可以忽略不计。这应该花费你整整5分钟$fields
,这将比使用乐器或理解每个电话更有效地利用时间。