完全匹配原型的 VLA 警告

问题描述

Gcc 11 显然将 -Wvla-parameters 添加到 -Wall,现在,由于我总是使用 -Werror,我收到如下错误

libtool: compile:  mpicc -DHAVE_CONfig_H -I. -I../../../src/yaxt/src -I../include -I../include -I../../../src/yaxt/src/../include -DgFortran -pthread -g -pipe -O3 -march=native -Wall -Wextra -Wconversion -Wstrict-overflow -Wno-error=unused-function -Wno-error=type-limits -Wno-unkNown-pragmas -Werror -Wstrict-aliasing -fsanitize=undefined -MT xt_xmap_dist_dir_common.lo -MD -MP -MF .deps/xt_xmap_dist_dir_common.Tpo -c ../../../src/yaxt/src/xt_xmap_dist_dir_common.c  -fPIC -DPIC -o .libs/xt_xmap_dist_dir_common.o
../../../src/yaxt/src/xt_xmap_dist_dir_common.c:239:9: error: mismatch in bound 1 of argument 7 declared as 'int (*)[(long int)(send_size_asize) - 1]' [https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html#index-Wvla-parameter-Werror=vla-parameter]
  239 |   int (*send_size)[send_size_asize],|   ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from ../../../src/yaxt/src/xt_xmap_dist_dir_common.c:62:
../../../src/yaxt/src/xt_xmap_dist_dir_common.h:142:9: note: prevIoUsly declared as 'int (*)[(long int)(send_size_asize) - 1]'
  142 |   int (*send_size)[send_size_asize],|   ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
Makefile:836: recipe for target 'xt_xmap_dist_dir_common.lo' Failed

但是 src/xt_xmap_dist_dir_common.h:142 处的声明

PPM_DSO_INTERNAL size_t
xt_xmap_dist_dir_pack_intersections(
  enum xt_xmdd_direction target,size_t num_intersections,const struct isect *restrict src_dst_intersections,bool isect_idxlist_delete,size_t send_size_asize,size_t send_size_idx,int (*send_size)[send_size_asize],unsigned char *buffer,size_t buf_size,size_t *ofs,MPI_Comm comm);

完全匹配定义:

size_t
xt_xmap_dist_dir_pack_intersections(
  enum xt_xmdd_direction target,MPI_Comm comm)
{
  int prev_send_rank = -1;
  size_t num_send_indices_requests = 0;
  size_t origin = 1 ^ target,ofs_ = *ofs;
  int position = 0;
  for (size_t i = 0; i < num_intersections; ++i)
  {
    /* see if this generates a new request? */
    int send_rank = src_dst_intersections[i].rank[target];
    num_send_indices_requests += send_rank != prev_send_rank;

    // pack rank
    XT_MPI_SEND_BUF_CONST int *prank
      = CAST_MPI_SEND_BUF(src_dst_intersections[i].rank + origin);
    if (send_rank != prev_send_rank && prev_send_rank != -1) {
      send_size[prev_send_rank][send_size_idx] = position;
      ofs_ += (size_t)position;
      position = 0;
    }
    prev_send_rank = send_rank;
    xt_mpi_call(MPI_Pack(prank,1,MPI_INT,buffer+ofs_,(int)(buf_size-ofs_),&position,comm),comm);
    // pack intersection
    xt_idxlist_pack(src_dst_intersections[i].idxlist,comm);

    if (isect_idxlist_delete)
      xt_idxlist_delete(src_dst_intersections[i].idxlist);
  }
  if (prev_send_rank != -1)
    send_size[prev_send_rank][send_size_idx] = position;

  *ofs = ofs_ + (size_t)position;
  return num_send_indices_requests;
}

如果有人对如何消除警告有任何建议(并允许用户随后坚持使用 -Wall 和 gcc 11.1),我们将不胜感激。

我知道我可以做一些类似的事情

#pragma GCC diagnostic ignored "-Wvla-parameter"

但这似乎是错误方法

crede 运行起来没有我预期的那么痛苦。 这似乎是消毒剂和 VLA 的不良交互: 重现的最小来源:

void a(long send_size_asize,int (*)[send_size_asize]);
void a(long send_size_asize,int (*)[send_size_asize]) {}

要检查的命令行:

gcc-11.1 -c -Wall -Werror -fsanitize=undefined mini.c

抱歉忘记提到-fsanitize,我现在经常使用它,这是第一次给我带来麻烦。

作为 #10158 提交给 gcc bugzilla。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)