gpt4 book ai didi

c++ - 将 unsigned char* 强制转换为 char* 并将取消引用的指针视为它真的指向 char 是否安全?

转载 作者:IT老高 更新时间:2023-10-28 21:55:51 25 4
gpt4 key购买 nike

在标题为 Warning generated due wrong strcmp parameter handling 的问题之后, 关于标准对字符类型的值表示的实际保证似乎存在一些问题。


问题

这看起来不错,但标准是否保证 (1) 将始终产生 true

char unsigned * p1 = ...;
char * p2 = reinterpret_cast<char *> (p1);

*p1 == *p2; // (1)

最佳答案

这可能会让您大吃一惊,

但在 C++11 标准 (N3337 ) 和即将推出的 C++14 ( N3797 ) 中没有这样的保证。

char unsigned * p1 = ...;
char * p2 = reinterpret_cast<char *> (p1);

*p1 == *p2; // (1), not guaranteed to be true

注意: charsigned 还是 unsigned 取决于具体实现; [basic.fundamental]p1



详情

标准保证每种字符类型都应;

  • 有相同的对齐要求
  • 占用相同数量的存储空间,并且;
  • 字符类型占用的所有存储位都应参与值表示,并且;
  • 值表示是一样的。

共享相同的存储量、对齐要求以及关于位参与的保证,意味着将引用一种类型 (unsigned char) 的左值转换为另一种(char), 是安全的.. 就实际 Actor 而言。

3.9.1p1 Fundamental types [basic.fundamental]

It is implementation-defined whether a char can hold negative values. Characters can be explicitly declared signed or unsigned.

A char, a signed char, and an unsigned char occupy the same amount of storage and have the same alignment requirements (3.11); that is, they have the same object representation. For character types, all bits of the object representation participate in the value representation.

For unsigned character types, all possible bit patterns of the value representation represent numbers. These requirements do not hold for other types.

3.9p4 Types [basic.types]

The object representation of an object of type T is the sequence of N unsigned char objects taken up by the object of type T, where N equals sizeof(T). The value representation of an object is the set of bits that hold the value of type T.



那么,有什么问题?

如果我们将 unsigned char ( UCHAR_MAX ) 的最大值分配给 *p1 并且 *p2signed *p2 将无法表示此值。我们将溢出 *p2 并且它很可能最终具有 -1 的值。

注意:有符号整数溢出实际上是未定义的行为


*p1 = UCHAR_MAX;

*p1 == *p2; // (1)

operator==两边必须是相同类型才能比较,目前一侧是unsigned char,另一侧是char.

因此编译器将求助于整体提升来找到一个可以表示两种类型的所有可能组合值的类型;在这种情况下,结果类型将是 int.

在积分提升之后,语句在语义上等价于int (UCHAR_MAX) == int(-1),当然是假的。

关于c++ - 将 unsigned char* 强制转换为 char* 并将取消引用的指针视为它真的指向 char 是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24032322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com