1

以下(简化的)代码被GCC系列处理得很糟糕

#include <vector>
#include <cilk/cilk.h>

void walk(std::vector<int> v, int bnd, unsigned size) {
  if (v.size() < size)
    for (int i=0; i<bnd; i++) {
      std::vector<int> vnew(v);
      vnew.push_back(i);
      cilk_spawn walk(vnew, bnd, size);
    }
}

int main(int argc, char **argv) {
  std::vector<int> v{};
  walk(v , 5, 5);
}

具体来说:

  • G++ 5.3.1 崩溃:

     red.cpp: In function ‘&lt;built-in>’:
     red.cpp:20:39: internal compiler error: in lower_stmt, at gimple-low.c:397
            cilk_spawn walk(vnew, bnd, size);
    
  • G++ 6.3.1 创建了一个代码,如果在一个内核上执行但有时会出现段错误,则该代码运行良好,如果使用更多内核,则在其他时候发出双重释放信号。一个拥有arch linux g++7的学生报告了类似的结果。

我的问题:该代码有问题吗?我是在调用一些未定义的行为还是只是我应该报告的错误?

4

1 回答 1

0

回答我自己的问题:

根据https://gcc.gnu.org/ml/gcc-help/2017-03/msg00078.html它确实是 GCC 中的一个错误。临时对象在父进程中被销毁,而不是在 cilk_spawn 中的子进程中。所以如果线程分叉真的发生了,它可能被过早地销毁了。

于 2017-03-15T10:56:42.200 回答