抑制具有灵活数组的结构的 -Wlto-type-mismatch 警告

Posted

技术标签:

【中文标题】抑制具有灵活数组的结构的 -Wlto-type-mismatch 警告【英文标题】:Suppress -Wlto-type-mismatch warning for struct with flexible array 【发布时间】:2017-07-12 03:27:34 【问题描述】:

我正在使用-Wlto-type-mismatch-Werror 进行gcc 编译(为了项目的其余部分)。我有一个extern struct 和一个灵活的数组,它会引发lto-type-mismatch 警告/错误。

这里的代码被提炼成一个例子:

h.h:

typedef struct 
  int i;
  int ints[];
 struct_t;

交流电:

#include "h.h"

extern struct_t my_struct;

int main()   // just here to avoid optimizing away the decls
  return my_struct.ints[0];

b.c:

#include "h.h"

struct_t my_struct = 
  20,
  
    1,
    2,
  ,
;

编译(此处使用 arm gcc,但使用原生 gcc 也会失败)

$ arm-none-eabi-gcc -flto -Wlto-type-mismatch -Werror a.c b.c -o foo
a.c:3:17: error: size of 'my_struct' differ from the size of original declaration [-Werror=lto-type-mismatch]
 extern struct_t my_struct;
                 ^
b.c:3:10: note: 'my_struct' was previously declared here
 struct_t my_struct = 
          ^
lto1: all warnings being treated as errors

我已经尝试在

中包含一个或两个声明
#pragma gcc diagnostic push
#pragma gcc diagnostic ignore "-Wlto-type-mismatch"
<decl>
#pragma gcc diagnostic pop

但我无法抑制警告,可能是因为它是链接时优化,而 #pragma 行在那时早已消失。

问题

您能建议一些方法来编译它并在其他地方保留警告吗? (或者-Wlto-type-mismatch 不应该抱怨灵活数组?如果是这样,我可以提交错误报告。)

【问题讨论】:

【参考方案1】:

在 gcc-help 邮件列表上查询后,我提交了一个错误:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81440。有事会在这里跟进。]

跟进:该错误已在 gcc 7.3.1 或更早版本中得到修复。

【讨论】:

以上是关于抑制具有灵活数组的结构的 -Wlto-type-mismatch 警告的主要内容,如果未能解决你的问题,请参考以下文章

具有严重抑制指数的 Matlab 双积分

未记录的 GCC 扩展:结构中的 VLA

数组,list,map,set各有啥优缺点;

在 Python 日志记录模块 AKA 日志压缩中抑制具有相同内容的多条消息

numpy使用np.printoptions函数抑制numpy对于长numpy数组的自动省略显示numpy数组中的所有数据

从嵌套列表创建数组时抑制 Numpy 中的科学记数法