微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

弱常量变量上的 GCC 优化错误

如何解决弱常量变量上的 GCC 优化错误

在不同优化级别(即 gcc-O0)上处理弱常量变量时,我遇到了奇怪的 -O1 行为。

代码如下:

def.h:声明

const int var;
int copy;
int do_copy(void);

weak.c:弱var定义,do_copy实现做copy = var

#include "def.h"
const int __attribute__((weak)) var = 1;
int do_copy(void)
{
    copy = var;
    return var;
}

ma​​in.c:强var定义,以及do_copy

的使用
#include <stdio.h>
#include "def.h"
int copy = 0;
int copy2 = 0;
const int var = 2;
int main(void)
{
    copy2 = do_copy();
    printf("copy=%d,copy2=%d\n",copy,copy2);
    return 0;
}

从这个“main.c”代码中,我期望 copycopy2 都保留强大的 var 值,即 2

这是经过-O0优化输出

$ gcc -O0 -c main.c -o main0.o
$ gcc -O0 -c weak.c -o weak0.o
$ gcc main0.o weak0.o -o main0
$ ./main0
copy=2,copy2=2

这是预期的结果。

这是经过-O1优化输出

$ gcc -O1 -c main.c -o main1.o
$ gcc -O1 -c weak.c -o weak1.o
$ gcc main1.o weak1.o -o main1
$ ./main1
copy=1,copy2=2

这是意外:虽然copy2确实保留了强值(2),但copy实际上被设置为弱值({{1} })!

在 'weak.c' 文件中,看起来 1 总是被评估为 var
我的看法是,当 1 被声明为 var 时,编译器认为它的值将始终为 const 并对整个文件进行优化(1 语句除外) )。因此,它忽略了弱/强的东西,并且不关心 'main.c' 中的强重定义!

问题可以通过以下方式解决

  • 在单独的文件中设置弱定义 (return),比如“weak2.c”。
  • 不使 const int __attribute__((weak)) var = 1; 保持不变(这可能是不可接受的!):var ---> const int var;

这对我来说仍然是一个 int var; 错误,但我是否遗漏了什么?

附录:

这是gcc的使用版本:

gcc

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。