【发布时间】:2013-12-25 12:29:00
【问题描述】:
我试图了解 gcc 与 clang 在这个简单的 C++11 程序的输出中暴露的不同行为是否是由于 clang 中的错误(Xcode 5.0.2,OS X 10.8.5)。代码如下:
#include <iostream>
int main() {
int matrix[][3]{{1,2,3}, {4,5,6}, {7,8,9}};
auto dyn_matrix = new int[3][3]{{1,2,3}, {4,5,6}, {7,8,9}};
std::cout << matrix[0][1] << std::endl;
std::cout << dyn_matrix[0][1] << std::endl;
return 0;
}
如图所示,我正在尝试使用统一初始化来初始化大小为3x3 的匿名(或命名)多维数组。从 MacPorts 使用 gcc 4.7 编译时,会获得预期的输出:
$g++-mp-4.7 -std=c++11 dyn_matrix.cpp -o dyn_matrix
$ ./dyn_matrix
2
2
$
相反,如果使用 clang,则输出为:
$ clang++ -std=c++11 -stdlib=libc++ dyn_matrix.cpp -o dyn_matrix_clang
$ ./dyn_matrix_clang
2
4
$
在这种情况下,结果(显然)是错误的。 clang --version 报道:
Apple LLVM version 5.0 (clang-500.2.75) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix
该怪谁?我,gcc 还是 clang?
2013 年 12 月 11 日更新:该错误应该已在 r196995 中修复。不幸的是,我们仍然不知道 Apple 更新 Xcode 附带的 clang 版本需要多长时间。
2013 年 12 月 9 日更新:我提交了一份关于 LLVM bugzilla 平台的错误报告。它确实被认为是一个错误,目前正在审查一个补丁,请参阅http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20131209/095099.html。
谢谢。
【问题讨论】:
-
Visual Studio 2013 使用
2 2获取另一个统计信息。 -
+1 提出了一个有趣的好问题。确认 OS X 10.7.5 上的
clang++v4.2 也会生成输出“2 4”的代码。我的直觉告诉我这是错误的。 -
嗯。我当前安装的 clang 版本在此代码上崩溃(clang 版本 3.4(主干 193991))。是时候更新了,看看是否更好......
-
我刚刚尝试使用
clang 3.4 (trunk 187030),我可以确认它在尝试编译该代码时会崩溃。 -
这里有一个更完整的现场演示:coliru.stacked-crooked.com/a/4465ae5a4677dc77。 @Dave
matrix是int [3][3]和dyn_matrix是int (*)[3],所以sizeof无济于事