3

说我size_type的 is uint64_t,我有以下循环( where szis of size_typetoo)

for ( size_type i= 0; i < sz; ++i ) {
     //something
     if ( i+1 == sz ) { //<-- here
         ///
     }
}

现在当用 flags 编译它时-fno-omit-frame-pointer -fsanitize=undefined -O2 -fsanitize=address,我得到一个运行时错误,它说在我here在上面的代码片段中标记的地方2147483647 + 1 cannot fit into integer,确实sz是比2^31-1. 但是,一切都应该没问题,因为可以保存值,并且应该uint64_t通过转换规则提升到. 我错过了什么?编辑:是不是总是有位?然后,-value 只是位,我们应该仍然可以。我现在在没有消毒剂的情况下运行我的东西,到目前为止还没有发生崩溃。编辑:i+1uint64_tuint64_t642147...32

clang 版本 8.0.0-3~ubuntu18.04.1 (tags/RELEASE_800/final) 目标:x86_64-pc-linux-gnu 线程模型:posix

而且我还有如下链接器标志

set (CMAKE_LINKER_FLAGS_DEBUG "${CMAKE_LINKER_FLAGS_DEBUG} -fno-omit-frame-pointer -fsanitize=undefined -fsanitize=address")

也许这也有干扰?我知道编译器资源管理器无法重现该错误,这很奇怪,需要我进一步调查。

4

1 回答 1

0

在最后一次迭代i = UINT64_MAX - 1中,所以i+1 = UINT64_MAXi <= UINT64_MAX在所有情况下都是如此。

for ( size_type i= 0; i < sz; ++i ) {
     //something
     if ( i+1 == sz ) { //<-- here
         ///
     }
}

没有溢出。clang 中可能存在错误,它试图进行不正确的归纳变量优化。

clang-8, rcx 递增直到达到 0。这可能是由于 1错误而导致的。

.LBB1_4:
        neg     rcx 
.LBB1_5:                                # =>This Inner Loop Header: Depth=1
        cmp     rax, rdi 
        jne     .LBB1_7
        mov     qword ptr [rsp - 8], rdi 
.LBB1_7:                                #   in Loop: Header=BB1_5 Depth=1
        add     rdi, 1
        inc     rcx 
        jne     .LBB1_5
.LBB1_8:

而铿锵9。递减,rcx直到达到 0。

.LBB1_7:
        ret 
.LBB1_6:                                #   in Loop: Header=BB1_4 Depth=1
        add     rdi, 1
        add     rcx, -1
        je      .LBB1_7
.LBB1_4:                                # =>This Inner Loop Header: Depth=1
        cmp     rax, rdi 
        jne     .LBB1_6
        mov     qword ptr [rsp - 8], rdi 
        jmp     .LBB1_6
于 2020-01-18T20:13:06.590 回答