某些软件中是否使用了"dog-tag"字段?

sev*_*ine 5 c c++

我正在读一本名为"Code Complete"的书.在书中,有一个关于"狗标记字段"的解释.

使用dog-tag字段检查内存是否损坏."标记字段"或"狗标记"是仅为了进行错误检查而添加到结构中的字段.

您是否见过软件或许多用户使用的某些软件中"dog-tag"字段的实际用法?

Mic*_*urr 2

麦康奈尔所说的“狗标签”只是将一个字段放入数据结构中,并使用可识别的值对其进行初始化。当结构被释放时,标签字段应该被“擦除”。

struct foo {
    unsigned int tag;
    int bar;
    char baz[20];
    char* qux;
};

enum {
    tag_freed = 0xcfcfcfcf,
    tag_foo = 0x206f6f66,   // "foo " in little-endian
};

struct foo* foo_alloc(void)
{
    struct foo template = {tag_foo};

    struct foo* p = malloc(sizeof struct foo);
    if (p) {
        *p = template;
    }

    return p;
}


int foo_validate(struct foo* p)
{
    return p && (p->tag == tag_foo);
}

void foo_free(struct foo* p)
{
    if (p) {
        if (!foo_validate(p)) error_handler(/* ... */);

        p->tag = tag_freed;
        free(p);
    } 
}
Run Code Online (Sandbox Code Playgroud)

这类标签有几个优点:

  • 它们非常便宜
  • 当在调试器中转储原始内存时,您可以了解原始内存中的内容。这对于内存泄漏来说非常方便。
  • 对内存损坏的一些最小检测
  • 可以帮助找到最终指向不再有效对象的指针

Windows 内核为驱动程序的标记内存分配提供内置支持(在这种情况下,标记由内核池管理器管理,并且位于驱动程序源代码中定义的结构外部):