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

时间:2014-05-20 23:26:36

标签: c++ c

我正在阅读名为" Code Complete"的书。在书中,有一个关于" dog-tag字段的解释"。

  

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

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

3 个答案:

答案 0 :(得分:4)

“dog-tag”字段或校验和仍在使用中。它们主要用于数据传输。

大多数计算机(嵌入式和台式机)的内存质量都有所提高。对内存的检查较少,这些检查是在计算机启动期间执行的快速测试。

如果您的数据非常重要且数据非常重要,您可能需要使用“dog-tag”或校验和字段。写入硬盘驱动器时,这可能非常有用。

某些错误检查方案存储的值有助于在有任何损坏的情况下重建数据。

如果故意更改结构中的任何数据成员,则需要更新该字段。这将对您的计划的性能产生负面影响。

答案 1 :(得分:2)

McConnell称之为“dog-tags”只是将一个字段放在一个用可识别的值初始化的数据结构中。当结构被释放时,标记字段应该被“擦除”。

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);
    } 
}

这些标签有几个好处:

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

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

答案 2 :(得分:1)

现代C / C ++运行时通常为您提供在分配后分配额外空间的选项,填充特殊的标记值,然后稍后检查该值以确保它没有被覆盖。

手动执行此操作需要大量工作才能获得可疑的好处。我肯定不会这样做,直到我怀疑存在实际的内存溢出错误...然后只有因为某些奇怪的原因,我才能在访问器函数中进行范围检查。

有些异常与某些不寻常的计算机体系结构的处理器间通信实用程序有关,但总的来说,我不会将此类检查作为类的明确部分。