【问题标题】:Can a plain `char` possibly have trap values?一个普通的“char”可能有陷阱值吗?
【发布时间】:2014-07-24 22:01:57
【问题描述】:

自述文件

“trap value”“trap 表示” 类型 T,是(底层存储的)位组合,产生 T. 的无效值试图解释无效值的表示会导致未定义的行为


让战斗开始吧..

另一个question 开始了关于char 的激烈讨论,以及具有trap representations 的实现的可能性。

问题

  • char 可能有陷阱值吗?

前面讨论中提到的引语:

这些部分是之前论证中引用最多的部分,它们是否相互矛盾?

3.9.1p1 基本类型 [basic.fundamental]

char 是否可以保存负值是实现定义的。字符可以显式声明为signedunsigned

一个char,一个signed char,和一个unsigned char占用相同的存储量并且具有相同的对齐要求(3.11);也就是说,它们具有相同的对象表示。对于字符类型,对象表示的所有位都参与值表示。

对于无符号字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型。

在任何特定的实现中,普通的 char 对象可以采用与 signed charunsigned char; 相同的值,其中一个是实现定义的。

3.9p2 类型 [basic.types]

对于普通可复制类型T, 的任何对象(基类子对象除外),无论该对象是否拥有T 类型的有效值,构成该对象的底层字节(1.7)都可以被复制放入charunsigned char. 的数组中

如果charunsigned char 数组的内容被复制回对象,则该对象随后应保持其原始值。

【问题讨论】:

  • 来自 C++11 标准“分配给寄存器的具有不确定值的 unsigned char 对象可能会陷入陷阱。” - 如果是这样的话,那么我希望 charsigned char 也是如此。
  • Filip,我们可以考虑将 AddressSanitizer/MemorySanitizer(现代 LLVM 和 GCC 中的可选功能)作为确认语言实现吗? Sanitizers 为每个记忆词添加一些标签(存储在单独的内存中,仿照苏联 Elbrus 架构标签,在一些大型 Burroughs 中类似的想法),并且对于标签的某些值存在陷阱,例如,读取未初始化的内存。跨度>
  • C++11 标准还明确列出了 numeric_limits<> 的特化 unsigned-、signed- 和“未指定”char,还有一个 static constexpr bool traps 成员,因此您可以检查在编译时,断言你是否关心等。
  • 反对者能否解释一下为什么这个问题会吸引-1

标签: c++ c++11 language-lawyer c++14


【解决方案1】:

标准告诉我们必须有:

  • char、signed char、unsigned char,大小都一样
  • sizeof(char) 为 1
  • char 至少有 8 位
  • 每个位组合都是有意义且有效的
  • char 数组已打包(如果是,则行为是)。

没有太多的回旋余地。

尽管如此,还是有建议在某些类型的操作期间,例如加载未初始化的内存或转换为陷阱。

是的,我认为一个实现可能有一个陷阱表示,其中陷阱值可能由于某种未定义或未指定的行为而出现,包括评估涉及未指定/未初始化值的表达式。导致陷阱值的实际位模式对实现来说是不可见的。

这样的 CPU 可能有 9 位字节,其中只有 8 位对编译器和运行时可见,第 9 位用于检测未初始化的内存,如果被(非特权)指令加载,将触发陷阱。

【讨论】:

  • AddressSanitizer 是此类 CPU 的软件仿真器,它为每个内存地址添加了额外的标记位。
  • @osgx:是的,我认为可能。我在 Burroughs 的大型系统上工作,该系统标记的是单词而不是字符。在标记的架构上,这种陷阱值对我来说似乎是可能的。
  • 最初的 IBM PC确实有 9 位字节,而 CPU 通常只有 8 位可用;内存存储通常会将第 9 位写入其他 8 位作为奇偶校验位,如果第 9 位与其他 8 位的奇偶校验不匹配,则内存读取通常会触发不可屏蔽中断,但是从什么我了解一些很少使用的诊断寄存器会改变这种行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多