c++ - 我是否在简单的 OpenMP for 循环中误用了引用变量,还是 clang 错误?

标签 c++ openmp clang++

我想我发现了一个 clang++ 错误,但希望就我的代码是否正确提出建议。 Clang 静态分析器认为它没问题,并且编译没有问题,但是当使用 clang 3.7 编译时,它从传递的引用 vector 中获取的大小完全错误。 GCC 和 clang 3.8 都给出了正确的答案。我已将其简化为这个测试用例:

#include <vector>
#include <iostream>
// including or excluding omp makes no difference
#include <omp.h>

void doSomething(std::vector<int> &k) {
#pragma omp for
    for (int i=0; i<2; ++i) {
            std::cout << k.size() << "\n";
    }
}

int main() {
    std::vector<int> v;
    v.push_back(1);

    std::vector<int> &j = v;
    doSomething(j);
    return(0);
}

使用 libomp(我认为),而不是 libgomp:

clang-3.7++ -fopenmp clang-err.cpp
./a.out
18446708892352074976
18446708892352074976


clang-3.8++ -fopenmp clang-err.cpp
./a.out
1
1

我在 clang 3.7 中找不到这样的错误,但在 3.8 中修复了。我不知道如何确定我是否在使用 libomp,尽管这是 LLVM/clang 的编译方式。这看起来是一件很简单的事情,所以我怀疑我在做一些奇怪的事情而不是有一个真正的 clang 错误。

如果共识是 clang 错误,我将针对 3.7 报告它。谢谢。

最佳答案

它看起来确实是一个 clang bug在当前版本 3.7 中。然而,令人惊讶的是,错误受让人关闭了针对 3.7 的错误,因为它已在 3.8 中修复。

关于c++ - 我是否在简单的 OpenMP for 循环中误用了引用变量,还是 clang 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32572966/

相关文章:

在我的 Mac 上使用 OpenMP 编译 C

根据条件选择 OpenMP pragma

c++ - 使用和不使用 fopenmp 标志编译 C++ 代码

c++ - 在基于范围的 for 循环中使用括号初始化列表是否不安全?

c++ - 是解析 C++ 的模板实例化部分

c++ - 将二维数组作为参数传递

c++ - 在 Mac OS X 上使用 gperftools 的问题

c++ - 无法将 CStringW 转换为 CStringA

c++ - clang++链接失败: error: source file is not valid UTF-8?

c++ - 如何正确显示此堆栈的内容?