当前位置: 首页 > 知识库问答 >
问题:

当使用char类型的glvalue访问另一种类型的对象时,是否不需要得到UB

万俟招
2023-03-14
int main(){
  int v = 1;
  char* ptr = reinterpret_cast<char*>(&v);
  char r = *ptr; //#1
}

在此片段中,表达式ptr指向一个int类型的对象,如:
expr.static.cast#13所示

否则,指针值将通过转换保持不变。

间接ptr将产生一个glvalue,该glvalue表示ptr指向的对象,如
expr.unary#op-1所示

结果是一个L值,它引用表达式所指向的对象或函数。

根据
basic.lval#11,使用允许类型的glvalue访问对象不会导致UB

如果程序试图通过glvalue访问([defns.access])对象的存储值,而glvalue的类型与下列类型之一不相似([conv.qual]),则该行为未定义:

  • 字符、无符号字符或std::byte类型。

它似乎也没有违反以下规则:
expr#pre-4

如果在计算表达式的过程中,结果未在数学上定义或不在其类型的可表示值范围内,则该行为未定义。

假设测试环境中char的宽度为8位,其范围为[-128,127]。v的值为1。那么,这是否意味着#1处的片段不会导致UB?

作为对比,给出以下示例

int main(){
  int v =  2147483647; // or any value greater than 127
  char* ptr = reinterpret_cast<char*>(&v);
  char r = *ptr; //#2
}

#2应该是UB,对吗?

共有1个答案

赖杰
2023-03-14

这是否意味着#1处的片段不会导致UB?

是的,引用的规则意味着#1的定义很好。

2号应该是UB对吧?

不,根据引用的规则,#2的行为也有很好的定义。

ptr的类型是char*,因此*ptr表达式的类型是char,其值不能超过char表示的值,因此expr#pre-4不适用。

假设测试环境中字符的宽度为8位,其范围为[-128,127]。

为了很好地定义#1,这个假设并不是必要的。

v的值为1

这并不是仅仅从上述假设中得出的。虽然标准没有确切地指定表示形式,但如果CPU有一个小的endian(包括前面的假设),这实际上是正确的。

 类似资料:
  • 问题内容: 假设我有这个课程: 一个线程可以在不访问该对象的情况下写入这些字段,而另一个线程可以读取它们吗? 注意:这些值可以彼此分开对待,因此在读取时更改没关系。 编辑 : 为了澄清起见,这些字段是 可变的 。只有它们引用的对象是 不可变的 。 问题答案: 从技术上讲,你需要让他们,或读取 和 使用写出来,以保证读者会读的最先进的最新值。正如您现在所拥有的,如果一个线程写入一个值,则不能保证另一

  • 问题内容: 假设我有这个课程: 一个线程可以在不访问该对象的情况下写入这些字段,而另一个线程可以读取它们吗? 注意:这些值可以彼此分开对待,因此在读取时更改没关系。 编辑 : 为了澄清起见,这些字段是 可变的 。只有它们引用的对象是 不可变的 。 问题答案: 从技术上讲,你需要让他们,或读取 和 使用写出来,以保证读者会读的最先进的最新值。正如您现在所拥有的,如果一个线程写入一个值,则不能保证另一

  • 考虑一个具有的API,如下所示: 很简单,只有页面大小和跳过计数属性。 此外,现在我还有一些类,它们也包含但未分页。 在我的测试中,我希望他们都能实现一个接口,这样我就可以用一些更基本的测试来生成一个通用的基本测试类。为此,我添加了我认为会起作用的内容: 我将PagedResults更改为: 错误 但现在编译器抱怨PagedResultBase继承的所有地方的使用情况(?)从。 但是,如果我将接口

  • 本文向大家介绍C#使用dynamic类型访问JObject对象,包括了C#使用dynamic类型访问JObject对象的使用技巧和注意事项,需要的朋友参考一下 dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。 使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。但如果没有,

  • 如果按照“字节”->“短”->“int”->“长”->“浮点”->“双倍”的自动转换,那么输出应该打印“双倍”,对吗? (https://www.geeksforgeeks.org/type-conversion-java-examples/)

  • 大家好,我正在制作一个菜谱应用程序,它显示食物的名称、图像和ingredants,所以我制作了一个简单的主页,制作了requst和一个类,该类提供了我从spooncular使用的这个url的数据。通用域名格式: https://api.spoonacular.com/recipes/complexSearch?apiKey=8fe91444f092411fa6011b71fd6e582d 这是主课