【问题标题】:Is this aditional const on extern an UB?这是外部 UB 上的附加 const 吗?
【发布时间】:2019-10-02 16:14:05
【问题描述】:

我有以下几点:

//h.h file
#pragma once
struct A { int x; };

//a.c file
#include "h.h"
struct A* a;

//b.c
#include "h.h"
extern struct A* const a;
int main() {}

我在extern 声明上添加了一个额外的const。添加这个const 会是UB?

如果它不是 UB,那么在 main 中执行以下操作将是 UB?

(*(struct A**)&a) = malloc(sizeof(struct A));

【问题讨论】:

  • FWIW #pragma once 也是假的。 :-)

标签: c constants language-lawyer undefined-behavior extern


【解决方案1】:

是的。来自附件 J.2:

  • 同一对象或函数的两个声明指定了不兼容的类型 (6.2.7)。

还有 6.2.7 ¶2:

引用同一对象或函数的所有声明都应具有兼容的类型;否则,行为未定义。

还有 6.7.3 ¶10:

对于要兼容的两个限定类型,两者都应具有兼容类型的相同限定版本;说明符或限定符列表中类型限定符的顺序不会影响指定的类型。

【讨论】:

    【解决方案2】:

    考虑以下编译单元:

    #include "h.h"
    extern struct A* const a;
    void externalFunction(void);
    int myFunction(void)
    {
      struct A *p1,*p2;
      p1 = a;
      externalFunction();
      p2 = a;
      return p2-p1;
    }
    

    该标准允许编译器基于const 指令假设a 的值不会因调用externalFunction 而改变。请注意,它不会考虑允许外部函数修改a 是否有好处。例如,在某些平台上,a 通常可能是写保护的,但外部函数(可能是用另一种语言编写的)可能能够禁用写保护,修改a,然后重新启用保护。允许这种可能性的实现是否有用取决于实现声称适用的目的范围,这是委员会不可能知道的,但编译器编写者应该知道。

    【讨论】:

      猜你喜欢
      • 2022-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 2018-12-16
      相关资源
      最近更新 更多