苹果LLVM 4.2段错误使用基于范围的循环与引用

问题描述:

我不知道这是否是附带的Xcode 4.6.3(4H1503)的LLVM的实际错误或如果我做的东西真的不清净。的代码段如下所示苹果LLVM 4.2段错误使用基于范围的循环与引用

for(auto &a : matrix[j]) { 
    a = false; 
} 

其中matrix是包含布尔vectorvector秒。我一直在用Visual Studio 2012进行一段时间的开发,但这似乎不成问题,但是应用程序还需要在Mac上运行,所以我继续测试它......而且我有点我惊讶于无法编译它。经仔细检查,我发现我从clang本身获得了完整的segfault,这通常表明非常糟糕的恶作剧正在进行。所以我很快地隔离了这段代码,并使用整数索引和全部爵士乐将循环更改为更加农民的版本。它像一个魅力。

我是否正确地假设我原来的循环应该是工作的(即使在这里我也见过类似的东西,除了VS2012没有什么可说的,真的)还是我犯了一个严重的错误你真的不应该使用这样的参考?

我想报告漏洞苹果之前知道这一点。

编辑

#include <vector> 

using namespace std; 

int main(void) { 
    vector<vector<bool>> matrix = vector<vector<bool>>(10, vector<bool>(5, false));; 

    for(auto &a : matrix[0]) { 
     a = true; 
    } 

    return 0; 
} 

clang -x c++ -std=c++11 -stdlib=libc++编译产生

0 clang 0x0000000100c57bb2 main + 12932498 
Stack dump: 
0. Program arguments: /usr/bin/clang -cc1 -triple x86_64-apple-macosx10.8.0 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name rbloop.cpp -pic-level 2 -mdisable-fp-elim -masm-verbose -munwind-tables -target-cpu core2 -target-linker-version 136 -resource-dir /usr/bin/../lib/clang/4.2 -fmodule-cache-path /var/folders/ny/y4mgzkq14db49kfh7rnvcnshqvrkjz/T/clang-module-cache -stdlib=libc++ -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /Users/af6539/src -ferror-limit 19 -fmessage-length 120 -stack-protector 1 -mstackrealign -fblocks -fobjc-runtime=macosx-10.8.0 -fobjc-dispatch-method=mixed -fobjc-default-synthesize-properties -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -o /var/folders/ny/y4mgzkq14db49kfh7rnvcnshqvrkjz/T/rbloop-AUzjp6.o -x c++ rbloop.cpp 
1. rbloop.cpp:9:22: current parser token '{' 
2. rbloop.cpp:6:16: parsing function body 'main' 
3. rbloop.cpp:6:16: in compound statement ('{}') 
clang: error: unable to execute command: Segmentation fault: 11 
clang: error: clang frontend command failed due to signal (use -v to see invocation) 
Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) 
Target: x86_64-apple-darwin12.4.0 
Thread model: posix 
clang: note: diagnostic msg: PLEASE submit a bug report to http://developer.apple.com/bugreporter/ and include the crash backtrace, preprocessed source, and associated run script. 
clang: note: diagnostic msg: 
******************** 

PLEASE ATTACH THE FOLLOWING FILES TO THE BUG REPORT: 
Preprocessed source(s) and associated run script(s) are located at: 
clang: note: diagnostic msg: /var/folders/ny/y4mgzkq14db49kfh7rnvcnshqvrkjz/T/rbloop-HcbryW.cpp 
clang: note: diagnostic msg: /var/folders/ny/y4mgzkq14db49kfh7rnvcnshqvrkjz/T/rbloop-HcbryW.sh 
clang: note: diagnostic msg: 

******************** 

我不是粘贴在末尾提到的文件,因为他们是大的离谱,似乎没有添加任何信息(只一堆库头文件,然后我的确切代码粘贴在文件末尾)。另外,如果你有我使用的相同编译器,你应该可以自己得到它们。

+0

需要更完整的示例。我们没有看到你的矩阵真的是什么,也不知道'j'是什么。如果'matrix'是'矢量>''然后矩阵[J]',假设有效的索引,将'矢量'。你打算如何将'false'赋值给'vector'? – DUman

+0

@ShafikYaghmour,完成,希望它有帮助。 @ user1264727:是,'矩阵[J]',假设正确的索引(其为)是布尔值的向量。你将一个容器传递给基于范围的循环,并获取循环内容器中的每个元素,在这种情况下,我的auto&a将是对bool的引用,这就是我打算将bool文本分配给bool变量的方式。阅读基于范围的循环:) – Morpheu5

正如霍华德说,编译器应该不会给你一个堆栈跟踪,但产生一个错误信息,因为你可以看到gcc做产生一个good diagnostic。您收到错误的原因是std::vector<bool>是一个专业化,这thread给出了一些很好的细节。因此至少在gccclang返回给你的是,作为参照的代理,但因为它是一个临时对象,你不能把它的一个引用,你并不需要,因为更改将被反射回来,我不知道有关视觉工作室。这example演示了我的意思。

+0

我希望我能接受这两个答案。我接受这个是因为这个链接,但是霍华德也非常有帮助。 – Morpheu5

有你的编译器转储堆栈跟踪你是总是在编译器中的错误。如果编译器不喜欢你的代码,它应该给你一个体面的错误消息,而不是它的内部堆栈跟踪。

与您的示例代码我希望沿着线诊断:

test.cpp:8:15: error: non-const lvalue reference to type '__bit_reference<[2 * ...]>' cannot bind to a temporary of type 
     '__bit_reference<[2 * ...]>' 
    for(auto &a : matrix[0]) { 
      ^~ 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/c++/v1/vector:2127:14: note: 
     selected 'begin' function with iterator type 'iterator' (aka '__bit_iterator<std::__1::vector<bool, 
     std::__1::allocator<bool> >, false>') 
    iterator begin() _NOEXCEPT 
      ^
1 error generated. 
+0

有趣的。所以我应该继续并报告错误,你说?此外,您使用哪个版本的编译器来获取该诊断?正如我所说,即使我的测试代码编译并运行良好与VS2012。 – Morpheu5

+0

@ Morpheu5有许多在线C++编译器使它更容易一些,'g ++'给你类似的警告:http://*.com/questions/3916000/online-c-compiler-and-evaluator –

+0

哇,谢谢!我甚至不知道这样的事情存在。在线C++编译器,现在很方便:) – Morpheu5