我想我发现了一个 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/