C++ 普通'char'是否可能有陷阱值?

C++ 普通'char'是否可能有陷阱值?,c++,c++11,language-lawyer,c++14,C++,C++11,Language Lawyer,C++14,自述文件 类型T的“陷阱值”或“陷阱表示法”是(底层存储器)的一种位组合,它产生一个无效的T值。试图解释无效值的表示法将导致未定义的行为 让战斗开始吧。。 另一位已经开始了一场关于char的热烈讨论,以及实现它的可能性 问题: char是否可能有陷阱值 前面讨论中提到的引用: 这些章节是上一次辩论中引用最多的章节,它们相互矛盾吗 3.9.1p1基本类型[basic.basical] 实现定义了字符是否可以包含负值。字符可以显式声明为有符号或无符号 char、Asigned char、和u

自述文件

类型
T
的“陷阱值”或“陷阱表示法”是(底层存储器)的一种位组合,它产生一个无效的
T值。
试图解释无效值的表示法将导致未定义的行为


让战斗开始吧。。 另一位已经开始了一场关于
char
的热烈讨论,以及实现它的可能性

问题

  • char
    是否可能有陷阱值

前面讨论中提到的引用: 这些章节是上一次辩论中引用最多的章节,它们相互矛盾吗

3.9.1p1
基本类型
[basic.basical]

实现定义了
字符
是否可以包含负值。字符可以显式声明为
有符号
无符号

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

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

在任何特定的实现中,普通
字符
对象可以具有与
有符号字符
无符号字符相同的值哪一个是实现定义的

3.9p2类型
[basic.Types]

对于普通可复制类型
T的任何对象(基类子对象除外),
无论该对象是否持有类型
T
的有效值,构成该对象的底层字节(1.7)都可以复制到
char
无符号char的数组中。

如果
字符
无符号字符
数组的内容被复制回对象,则该对象随后应保持其原始值


标准告诉我们必须:

  • 字符,有符号字符,无符号字符,大小相同
  • 字符的大小为1
  • char至少有8位
  • 每一位组合都是有意义和有效的
  • 字符数组已打包(如果是,则其行为为)
没有多少回旋余地

然而,有人建议,在某些类型的操作期间,例如加载未初始化的内存或转换时,可能会出现陷阱

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


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

陷阱值:根据C++11标准,“分配给寄存器的值不确定的无符号字符对象可能会陷阱。”如果是这样的话,那么我希望它是真实的<代码> char < /> >和<代码>符号char < /C> > Filip,我们可以考虑AdvrsSaliZiTe/MeimySuniZiver(在现代LLVM和GCC中的可选特性)作为确认语言实现吗?消毒剂会在每个记忆单词中添加一些标签(存储在单独的内存中,仿照苏联埃尔布鲁斯体系结构的标签,在一些大型巴勒斯也有类似的想法),并且标签的某些值存在陷阱,例如,读取未初始化内存。C++11标准还明确列出了
无符号
-、
有符号
-和“unspecified”
字符
数值限制
专门化,并且有一个
静态constexpr bool traps
成员,因此您可以在编译时进行检查,断言是否关心等等。请投票人解释为什么这个问题会吸引-1?AddressSanitizer是这种CPU的软件仿真器,它对每个内存地址都有额外的标记位。@osgx:是的,我想可能会。我在Burroughs的大型系统上工作,该系统标记的是单词而不是字符。在标记的体系结构上,这种陷阱值对我来说似乎是可能的;内存存储通常会将第9位写入其他8位的奇偶校验位,如果第9位与其他8位的奇偶校验不匹配,内存读取通常会触发不可屏蔽中断,但据我所知,一些很少使用的诊断寄存器会改变这种行为。