2013-07-31 32 views
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

回答

3

正如霍華德說,編譯器應該不會給你一個堆棧跟蹤,但產生一個錯誤信息,因爲你可以看到gcc做產生一個good diagnostic。您收到錯誤的原因是std::vector<bool>是一個專業化,這thread給出了一些很好的細節。因此至少在gccclang返回給你的是,作爲參照的代理,但因爲它是一個臨時對象,你不能把它的一個引用,你並不需要,因爲更改將被反射回來,我不知道有關視覺工作室。這example演示了我的意思。

+0

我希望我能接受這兩個答案。我接受這個是因爲這個鏈接,但是霍華德也非常有幫助。 – Morpheu5

5

有你的編譯器轉儲堆棧跟蹤你是總是在編譯器中的錯誤。如果編譯器不喜歡你的代碼,它應該給你一個體面的錯誤消息,而不是它的內部堆棧跟蹤。

與您的示例代碼我希望沿着線診斷:

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://stackoverflow.com/questions/3916000/online-c-compiler-and-evaluator –

+0

哇,謝謝!我甚至不知道這樣的事情存在。在線C++編譯器,現在很方便:) – Morpheu5