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
是包含布尔值的vector
的vector
。我已经使用 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:
********************
我没有粘贴最后提到的文件,因为它们大得离谱,似乎没有添加任何信息(只是一堆库标题,然后我的确切代码粘贴在文件末尾(。此外,如果你有和我一样的编译器,你应该能够自己得到它们。
让编译器转储堆栈跟踪始终是编译器中的一个错误。 如果编译器不喜欢你的代码,它应该给你一个体面的错误消息,而不是其内部的堆栈跟踪。
使用您的示例代码,我希望得到以下诊断:
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>
是一种专业化,此线程提供了一些很好的详细信息。因此,至少在gcc
和clang
中,您得到的是一个充当引用的代理,但由于它是一个临时对象,因此您不能引用它,也不需要,因为更改会反映回来,我不确定视觉工作室。这个例子说明了我的意思。
- 为什么我的变量存在于其范围之外
- C++参数类型以接受适用于基于范围的 for 循环的所有序列
- 代码具有特定于函数的变量,用于更改范围之外的值
- 将自适应阈值应用于范围函数 opencv c++
- 为什么我将矢量下标出范围超出范围
- C++:将参数应用于函数范围
- C++11:用容器参数定义函数(类似于基于范围的)
- 在C /STL中,是否有相当于Python范围()的紧凑型
- 如何制作增强多指数复合范围语句,等效于x和y
- std::copy_n 是否适用于重叠范围?
- 依赖于模板参数的范围查找
- 在现代C++中,有没有类似于python中基于范围的“enumerate”循环
- 如何让代码存在于两个或多个非嵌套命名空间的范围内
- 如何使用范围 v3 范围实现平面地图
- 应用于单词数组的随机数范围
- 标准算法 any_of()、all_of() 和 none_of() 应用于空范围
- 常数,但仅适用于此范围的剩余部分
- 确定谓词是否适用于一个范围的全部、部分或全部元素
- 存储一组不重叠的范围,并严格查找一个值是否存在于任何一个范围中
- 'make_error_code' 未在此范围内声明,并且在实例化点通过依赖于参数的查找未找到任何声明