【问题标题】:how to find overlaps between src & dest in strcpy(and similar functions)如何在 strcpy(和类似函数)中找到 src 和 dest 之间的重叠
【发布时间】:2015-10-08 17:34:59
【问题描述】:

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

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

有人知道 gcc 强化是否可以解决这个问题吗? 或者除了包装这些功能并自己检查之外的其他想法?

【问题讨论】:

  • 没有一种方法可以静态地找出所有此类潜在问题。

标签: gcc overlap memcpy strcpy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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。

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

    【讨论】:

    • 为什么要包装 memcpy() 来检查重叠,而 memmove() 已经这样做了?
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2011-01-24
    • 2017-04-10
    相关资源
    最近更新 更多