Я не уверен, является ли это действительной ошибкой LLVM, которая идет с Xcode 4.6.3 (4H1503), или я делаю что-то действительно не кошерное. Фрагмент кода выглядит следующим образом
for(auto &a : matrix[j]) {
a = false;
}
где matrix
это vector
из vector
s, содержащие логические значения. Некоторое время я занимался разработкой 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++
доходность
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:
********************
Я не вставляю файлы, упомянутые в конце, потому что они смехотворно велики и, похоже, не добавляют никакой информации (просто набор заголовков библиотеки, а затем мой точный код, как указано выше, вставленный в конец файла). Кроме того, если у вас был такой же компилятор, как у меня, вы сможете получить их сами.
Как говорит Говард, компилятор не должен давать вам трассировку стека, а должен выдавать сообщение об ошибке, и, как вы можете видеть, gcc
действительно производит хорошая диагностика. Причина, по которой вы получаете ошибку, состоит в том, что std::vector<bool>
это специализация и это нить дает некоторые хорошие детали. Так по крайней мере в gcc
а также clang
вы получаете прокси-сервер, который действует как ссылка, но так как это временный объект, вы не можете ссылаться на него и вам это не нужно, так как изменения будут отражены обратно, хотя я не уверен насчет Visual Studio. это пример демонстрирует, что я имею в виду.
Наличие у вас компилятора дампов трассировки стека на вас всегда ошибка в компиляторе. Если компилятору не нравится ваш код, он должен дать вам достойное сообщение об ошибке, а не трассировку стека своих внутренних компонентов.
С вашим примером кода я бы ожидал диагностики в соответствии с:
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.