说我size_type
的 is uint64_t
,我有以下循环( where sz
is of size_type
too)
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+1
uint64_t
uint64_t
64
2147...
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")
也许这也有干扰?我知道编译器资源管理器无法重现该错误,这很奇怪,需要我进一步调查。