如何解决完全匹配原型的 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 举报,一经查实,本站将立刻删除。