clang 标准库错误或 C++ 未定义行为?
clang standard library bug or c++ undefined behavior?
以下 C++ 程序是否包含任何未定义的行为?
int
main()
{
struct entry
{
uint32_t hash;
uint32_t idx;
};
entry arr[31] = {
{ 7978558, 0}, { 9241630, 1}, { 65706826, 2},
{ 639636154, 3}, {1033996244, 4}, {1225598536, 5},
{1231940272, 6}, {1252372402, 7}, {2019146042, 8},
{1520971906, 9}, {1532931792, 10}, {1818609302, 11},
{1971583702, 12}, {2116478830, 13}, { 883396844, 14},
{1942092984, 15}, {1274626222, 16}, { 333950222, 17},
{1265547464, 18}, { 965867746, 19}, {1471376532, 20},
{ 398997278, 21}, {1414926784, 22}, {1831587680, 23},
{ 813761492, 24}, { 138146428, 25}, { 337412092, 26},
{ 329155246, 27}, { 21320082, 28}, {1751867558, 29},
{1155173784, 30},
};
std::sort(std::begin(arr), std::end(arr),
[](entry a, entry b) { return a.hash <= b.hash; });
}
当我使用 gnu c++ 编译器或 12.0.0 之后的任何 clang/llvm 编译时,程序运行良好。然而,当我使用 clang 版本 12.0.0(我的 Mac 笔记本电脑上的默认编译器)编译它时,它在 std::sort()
内部崩溃,如下所示:
$ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.2)
Target: x86_64-apple-darwin21.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ g++ -g -std=c++11 bug.cc
$ ./a.out
Segmentation fault: 11
另外,如果我将其更改为使用 std::vector 而不是固定大小的数组。使用 clang 12.0.0
编译时 std::sort() 永远不会 return
是的,比较器不是严格的弱排序,它违反了 std::sort
的先决条件,导致未定义的行为。
对于两个参数 a
和 b
(可能相同),严格的弱排序 comp
永远不应将 comp(a,b)
和 comp(b,a)
计算为 true
。换句话说,它应该模拟 built-in <
的行为,而不是 <=
.
因此在您的代码中它应该是 <
,而不是 <=
,以使其成为严格的弱排序。
以下 C++ 程序是否包含任何未定义的行为?
int
main()
{
struct entry
{
uint32_t hash;
uint32_t idx;
};
entry arr[31] = {
{ 7978558, 0}, { 9241630, 1}, { 65706826, 2},
{ 639636154, 3}, {1033996244, 4}, {1225598536, 5},
{1231940272, 6}, {1252372402, 7}, {2019146042, 8},
{1520971906, 9}, {1532931792, 10}, {1818609302, 11},
{1971583702, 12}, {2116478830, 13}, { 883396844, 14},
{1942092984, 15}, {1274626222, 16}, { 333950222, 17},
{1265547464, 18}, { 965867746, 19}, {1471376532, 20},
{ 398997278, 21}, {1414926784, 22}, {1831587680, 23},
{ 813761492, 24}, { 138146428, 25}, { 337412092, 26},
{ 329155246, 27}, { 21320082, 28}, {1751867558, 29},
{1155173784, 30},
};
std::sort(std::begin(arr), std::end(arr),
[](entry a, entry b) { return a.hash <= b.hash; });
}
当我使用 gnu c++ 编译器或 12.0.0 之后的任何 clang/llvm 编译时,程序运行良好。然而,当我使用 clang 版本 12.0.0(我的 Mac 笔记本电脑上的默认编译器)编译它时,它在 std::sort()
内部崩溃,如下所示:
$ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.2)
Target: x86_64-apple-darwin21.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
$ g++ -g -std=c++11 bug.cc
$ ./a.out
Segmentation fault: 11
另外,如果我将其更改为使用 std::vector 而不是固定大小的数组。使用 clang 12.0.0
编译时 std::sort() 永远不会 return是的,比较器不是严格的弱排序,它违反了 std::sort
的先决条件,导致未定义的行为。
对于两个参数 a
和 b
(可能相同),严格的弱排序 comp
永远不应将 comp(a,b)
和 comp(b,a)
计算为 true
。换句话说,它应该模拟 built-in <
的行为,而不是 <=
.
因此在您的代码中它应该是 <
,而不是 <=
,以使其成为严格的弱排序。