某些软件中是否使用"dog-tag"字段?
Is "dog-tag" fields used in some software?
我在读《代码大全》这本书。书中有"dog-tag field"的解释
使用狗标签字段检查损坏的内存。"标签字段"或"狗标签"是您添加到结构中的字段,仅用于错误检查。
您是否在您的软件或许多用户使用的某些软件中见过"dog-tag"字段的实际用法?
"dog-tag"字段或校验和仍在使用中。它们主要用于数据传输。
大多数计算机(嵌入式和台式)的内存质量都有所提高。对内存的检查较少,这些检查是在计算机上电时执行的快速测试。
如果你的数据是非常关键和重要的数据,你可能想要使用'dog-tag'或checksum字段。这在写入硬盘驱动器时很有用。
一些错误检查方案存储的值将有助于在有任何损坏时重建数据。
如果有意更改结构中的任何数据成员,则需要更新字段。这将对程序的性能产生负面影响。
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内核为驱动程序提供了对标记内存分配的内置支持(在这种情况下,标记由内核池管理器管理,并且在驱动程序源代码中定义的结构之外):
- 池标签简介
现代C/c++运行时通常让您选择在分配之后分配额外的空间,用一个特殊的哨兵值填充,然后稍后检查该值以确保它没有被覆盖。
手动执行此操作的工作量很大,其益处值得商榷。我当然不会这样做,直到我怀疑有一个实际的内存溢出错误…然后,由于某种奇怪的原因,我不能在访问器函数中进行范围检查。
也有例外,与某些不寻常的计算机体系结构的处理器间通信实用程序有关,但一般来说,我不会将这种检查作为类的显式部分。
相关文章:
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何避免在数据结构中包含存储为字段的类?
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- 某些软件中是否使用"dog-tag"字段?