首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用神奇的调试值(如0xDEADBEEF)作为文本究竟有什么危险?

使用神奇的调试值(如0xDEADBEEF)作为文本究竟有什么危险?
EN

Stack Overflow用户
提问于 2009-11-05 15:08:48
回答 10查看 936关注 0票数 2

不用说,使用硬编码的十六进制文字指针是一场灾难:

代码语言:javascript
运行
复制
int *i = 0xDEADBEEF;
// god knows if that location is available

然而,使用十六进制文字作为变量值的真正危险是什么?

代码语言:javascript
运行
复制
int i = 0xDEADBEEF;
// what can go wrong?

如果由于这些值的在各种调试方案中使用,这些值确实是“危险的”,那么这意味着即使我不使用这些文本,在运行时偶然发现其中一个值的任何程序也可能崩溃。

有人想解释使用十六进制文字的真正危险吗?

编辑:只是澄清一下,我指的不是源代码中常量的一般用法。我专门讨论的是调试场景问题,它可能涉及十六进制值的使用,并给出了0xDEADBEEF的具体示例。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-11-05 15:27:53

我相信今天早些时候在IP地址格式化问题中提出的关注与一般十六进制文字的使用无关,而与0xDEADBEEF的具体使用有关。至少我是这么看的。

尤其是使用0xDEADBEEF,我认为这是一个小问题。问题是,许多调试器和运行时系统已经将此特定值用作标记值,以指示未分配的堆、堆栈上的错误指针等。

我不记得是哪个调试和运行时系统使用了这个特定的值,但是这些年来我已经多次看到它这样使用了。如果您在这些环境中进行调试,代码中的0xDEADBEEF常量的存在将与未分配RAM中的值或其他值无法区分,因此充其量您将不会有那么有用的RAM转储,而且在最坏的情况下,您将收到调试器的警告。

无论如何,当他告诉你“在各种调试场景中使用”时,我认为这就是最初的评论的意思。

票数 2
EN

Stack Overflow用户

发布于 2009-11-05 15:12:23

使用十六进制文字没有比任何其他类型的文字更危险。

如果调试会话最终以代码的形式执行数据,而没有打算执行数据,那么无论如何,您都处在一个痛苦的世界中。

当然,有一个正常的“魔术值”和“良好的常量”代码气味/清洁问题,但我认为这并不是真正的危险。

票数 11
EN

Stack Overflow用户

发布于 2009-11-05 15:13:48

除了少数例外,没有什么是“不变的”。

我们更喜欢称它们为“慢变量”--它们的值变化太慢,以至于我们不介意重新编译来改变它们。

但是,我们不希望通过应用程序或测试脚本拥有许多0x07实例,其中每个实例都有不同的含义。

我们想在每一个常数上加上一个标签,使其完全明确它的含义。

代码语言:javascript
运行
复制
if( x == 7 )

在上述声明中,"7“是什么意思?这是不是和

代码语言:javascript
运行
复制
d = y / 7;

这就是"7“的意思吗?

测试用例是一个稍微不同的问题。我们不需要对数字文字的每个实例进行广泛、仔细的管理。相反,我们需要文件。

我们可以--在一定程度上--通过在代码中加入一点提示来解释"7“从何而来。

代码语言:javascript
运行
复制
assertEquals( 7, someFunction(3,4), "Expected 7, see paragraph 7 of use case 7" );

一个“常数”应该说--并命名--准确地说一次。

单元测试中的“结果”与常量不是一回事,在解释它从何而来时,需要谨慎一点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1681144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档