簡體   English   中英

Apple LLVM 4.2段錯誤使用基於范圍的循環和引用

[英]Apple LLVM 4.2 segfaults using range-based loops with references

我不確定這是否是Xcode 4.6.3(4H1503)附帶的LLVM的實際錯誤,或者我是否正在做一些非常猶太的事情。 代碼片段如下

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

其中matrix是一個vectorvector小號含有布爾值。 我一直在使用Visual Studio 2012進行一段時間的開發,這似乎不是一個問題,但隨后應用程序需要在Mac上運行,所以我繼續測試它......我有點驚訝於我無法編譯。 仔細觀察后,我發現我從鏗鏘聲中得到了一個完整的段落故障,這通常表明非常糟糕的惡作劇正在發生。 所以我迅速隔離了這段代碼,並使用整數索引和所有爵士樂將循環更改為更農民的版本。 它就像一個魅力。

假設我的原始循環應該正常工作我是否正確(我在SO中看到了類似的東西,除了VS2012之外沒有任何可說的,真的)或者我犯了一個嚴重的錯誤你真的不應該使用這樣的引用?

在向Apple報告錯誤之前,我想知道這一點。

編輯

#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++編譯clang -x c++ -std=c++11 -stdlib=libc++ yield

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: 

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

我沒有粘貼最后提到的文件,因為它們非常大而且似乎沒有添加任何信息(只是一堆庫頭,然后我的確切代碼如上面粘貼在文件的末尾)。 此外,如果你有相同的編譯器,你應該能夠自己得到它們。

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

使用您的示例代碼,我希望診斷符合以下方面:

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.

正如霍華德所說,編譯器不應該給你一個堆棧跟蹤但產生錯誤信息,你可以看到gcc確實產生了良好的診斷 您收到錯誤的原因是std::vector<bool>是一個特殊化,這個線程提供了一些很好的細節。 所以至少在gccclang你得到的是一個代理作為參考,但因為它是一個臨時對象,你不能參考它,你不需要,因為更改將反映回來,我是雖然不確定視覺工作室。 這個例子說明了我的意思。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM