私size_type
が isだとするとuint64_t
、次のループがあります (ここでsz
is 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 は単なるビットであり、問題はありません。私は現在、サニタイザーなしで自分のことを実行していますが、これまでのところクラッシュは発生していません. 編集:here
2147483647 + 1 cannot fit into integer
sz
2^31-1
uint64_t
i+1
uint64_t
uint64_t
64
2147...
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")
多分それも干渉していますか?コンパイラ エクスプローラがエラーを再現できないことはわかっていますが、これは奇妙であり、さらに調査する必要があります。