【发布时间】:2014-07-24 22:01:57
【问题描述】:
自述文件
“trap value” 或 “trap 表示” 类型T,是(底层存储的)位组合,产生T.的无效值试图解释无效值的表示会导致未定义的行为。
让战斗开始吧..
另一个question 开始了关于char 的激烈讨论,以及具有trap representations 的实现的可能性。
问题:
-
char可能有陷阱值吗?
前面讨论中提到的引语:
这些部分是之前论证中引用最多的部分,它们是否相互矛盾?
3.9.1p1基本类型[basic.fundamental]
char是否可以保存负值是实现定义的。字符可以显式声明为signed或unsigned。一个
char,一个signed char,和一个unsigned char占用相同的存储量并且具有相同的对齐要求(3.11);也就是说,它们具有相同的对象表示。对于字符类型,对象表示的所有位都参与值表示。对于无符号字符类型,值表示的所有可能的位模式都表示数字。这些要求不适用于其他类型。
在任何特定的实现中,普通的
char对象可以采用与signed char或unsigned char;相同的值,其中一个是实现定义的。
3.9p2 类型
[basic.types]对于普通可复制类型
T,的任何对象(基类子对象除外),无论该对象是否拥有T类型的有效值,构成该对象的底层字节(1.7)都可以被复制放入char或unsigned char.的数组中如果
char或unsigned char数组的内容被复制回对象,则该对象随后应保持其原始值。
【问题讨论】:
-
来自 C++11 标准“分配给寄存器的具有不确定值的 unsigned char 对象可能会陷入陷阱。” - 如果是这样的话,那么我希望
char和signed 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