相关疑难解决方法(0)

UB是否可以抛弃const和读取值?

澄清:我的问题是:

  • UB是否使用左值类型int来访问有效类型的对象const int

这个问题有两个代码示例,它们使用左值类型int来访问有效类型的对象const int,我的目的是尽可能少地分散对象.如果除了这个特定问题之外还有任何其他UB来源,请发表评论,我将尝试更新代码示例.


以下是讨论的具体代码示例:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const int c = 5;

    printf("%d\n", *(int *)&c);
}
Run Code Online (Sandbox Code Playgroud)

我认为它可能是UB的原因是严格的别名规则似乎说它是UB:

C11 6.5/7

对象的存储值只能由具有以下类型之一的左值表达式访问:

  • 与对象的有效类型兼容的类型,
  • 与对象的有效类型兼容的类型的限定版本,
  • ...

这里对象有效类型(6.5/6)是const int.

第一个要点:int并且const int兼容类型(6.2.7/1,6.7.3/10).

第二个要点:int似乎不是合格版本const int,因为我们没有通过添加限定符来生成它.但是6.2.5/26不清楚:

每个非限定类型都有几个类型的限定版本,对应于const,volatile和restrict限定符中的一个,两个或全部三个的组合.类型的限定或非限定版本是属于相同类型类别且具有相同表示和对齐要求的不同类型.派生类型不是由派生类型的限定符(如果有)限定的.

它没有定义什么是"合格版本const int",它只在应用于非限定类型时定义术语"限定版本".


第二个代码示例:

int *pc = malloc(sizeof *pc);
memcpy(pc, &c, sizeof c);
printf("%d\n", *pc);   // UB?
Run Code Online (Sandbox Code Playgroud)

由于 …

c strict-aliasing language-lawyer

6
推荐指数
1
解决办法
256
查看次数

标签 统计

c ×1

language-lawyer ×1

strict-aliasing ×1