LLVM / LLDB的不确定行为(XCode 5.1.1)

Monsteruash

请不要对诸如我应该如何通过引用等方式发表评论。这段代码完全是实验性的。专注于非确定性行为。

我知道标题听起来很怀疑。

这是怎么回事:

vector<int> find_permutation2(vector<int> v) {
    int k = (int)v.size() - 1;
    while(k >= 0 && v[k] >= v[k + 1])
        k--;
    if(k == -1) return vector<int>();

    int i;
    for(i = (int)v.size() - 1; i > k; i--) {
        if(v[i] > v[k])
            break;
    }

    vector<int> r(v);
    std::swap(r[k], r[i]);
    std::reverse(r.begin() + k + 1, r.end());
    return r;
}

int main() {
    vector<int> foo = {2,3,4,1,0};
    vector<int> bar = find_permutation2(foo);
    default_random_engine g;
    uniform_int_distribution<int> dist(5,10);
    for(int i = 0; i < 10000; i++) {
        int size = dist(g);
        vector<int> p(size);
        iota(p.begin(), p.end(), 0);
        shuffle(p.begin(), p.end(), g);

        //
        // BREAKPOINT ON THE FOLLOWING LINE
        // I continue until p == {2,3,4,1,0}
        //
        vector<int> r = find_permutation2(p);
        vector<int> pc = vector<int>(p);
        bool res = std::next_permutation(pc.begin(), pc.end());

        if(res)
            assert(pc == r);
        else
            assert(r.size() == 0);
} 

现在,请检查我的LLDB输出是否存在某些查询(请注意产生的不同输出):

(lldb) expr find_permutation2(p)
    (std::__1::vector<int, std::__1::allocator<int> >) $0 = size=5 {
        [0] = 2
        [1] = 4
        [2] = 0
        [3] = 1
        [4] = 3
    }

(lldb) expr find_permutation2(p)
    (std::__1::vector<int, std::__1::allocator<int> >) $2 = size=5 {
        [0] = 2
        [1] = 3
        [2] = 4
        [3] = 1
        [4] = 0
    }

(lldb) expr find_permutation2(foo)
    (std::__1::vector<int, std::__1::allocator<int> >) $0 = size=5 {
        [0] = 2
        [1] = 3
        [2] = 4
        [3] = 1
        [4] = 0
    }

(lldb) expr find_permutation2(foo)
    (std::__1::vector<int, std::__1::allocator<int> >) $2 = size=5 {
        [0] = 2
        [1] = 4
        [2] = 0
        [3] = 1
        [4] = 3
    }

顺便说一句,不仅是LLDB。如果我运行代码,则断言有时会失败,而有时不会在给定的input上失败{2,3,4,1,0}上述两者之间的输出似乎完全是随机的。

编辑-明确的问题

有人可以告诉我为什么相同功能调用的相同输入得到不同的输出吗?

艾伦·斯托克斯

在这段代码中

int k = (int)v.size() - 1;
while(k >= 0 && v[k] >= v[k + 1])

v[k+1]指的是v第一次迭代结束后的元素,该元素给出未定义的行为。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

x 1:0`变成40,行为不确定?

来自分类Dev

llvm中i1的字面量

来自分类Dev

Xcode 5 llvm-g ++和llvm-gcc路径?

来自分类Dev

线程1:信号SIGABRT IOS Xcode 5

来自分类Dev

使用LLVM的libc ++时__1符号从哪里来?

来自分类Dev

了解“ 5 1”的类型

来自分类Dev

确定1,000以下5的最大倍数的总和

来自分类Dev

如何解决Xcode 5中的Apple LLVM 5.0错误?

来自分类Dev

Xcode 5“缺少编译器规范LLVM 4.2”错误

来自分类Dev

在Xcode 5上使用Boost-Apple LLVM 5.0

来自分类Dev

系列:1 + 1/3 + 1/5 + ...最多N个词

来自分类Dev

无法挤压dim [1],预期尺寸为1,得到5

来自分类Dev

如何确定磁盘是RAID 5还是RAID 1的一部分?

来自分类Dev

PHP中“!print(“ 1”)|| 1“的异常行为

来自分类Dev

PHP中“!print(“ 1”)|| 1“的异常行为

来自分类Dev

如何在Xcode 5上找到arm-apple-darwin#-llvm-gcc-4.2编译器?

来自分类Dev

How to find arm-apple-darwin#-llvm-gcc-4.2 compiler on Xcode 5?

来自分类Dev

雄辩的Javascript第5章练习1

来自分类Dev

HDF5:创建1维属性

来自分类Dev

z ^ 5 + 1吸引盆地(Matlab)

来自分类Dev

Qt 4更新为Qt 5 .1

来自分类Dev

在iPad 1上部署iOS 5应用

来自分类Dev

HDF5:创建1维属性

来自分类Dev

Elasticsearch 5:提升 1 个字段

来自分类Dev

取每条奇数行 (1, 3, 5, ...)?

来自分类Dev

将 1 列拆分为 5 列

来自分类Dev

Xcode 5挂起iOS 7.0.3设备,日志无法获取进程-1的任务

来自分类Dev

Xcode 5 hangs iOS 7.0.3 devices and logs failed to get the task for process -1

来自分类Dev

(new Uint8Array(1))[0] = 0x100的结果不确定吗?