3

size_typeが isだとするとuint64_t、次のループがあります (ここでszis ofsize_typeも)

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

これを flags でコンパイルすると、上記のコード スニペットで-fno-omit-frame-pointer -fsanitize=undefined -O2 -fsanitize=addressマークした場所に という実行時エラーが表示されます。ただし、すべて問題なく、値を保持できるため、変換ルールによってに昇格する必要があります。私は何が欠けていますか?編集:常にビットがあるのではないですか? 次に、-value は単なるビットであり、問​​題はありません。私は現在、サニタイザーなしで自分のことを実行していますが、これまでのところクラッシュは発生していません. 編集:here2147483647 + 1 cannot fit into integersz2^31-1uint64_ti+1uint64_tuint64_t642147...32

clang version 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_MAXにおいてそうです。i <= 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の間。はrcx0 になるまで減分されます。

.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 に答える