gpt4 book ai didi

c++ - Clang 未能检测到未定义的行为

转载 作者:行者123 更新时间:2023-11-28 01:42:25 28 4
gpt4 key购买 nike

如何检测下面示例中的未定义行为?

#include <iostream>
#include <stream>
int main() {
std::cout << "Undefined: " << std::string().front() << std::endl;
return 0;
}

使用 clang++ -fsanitize=address,undefined -g -Wall -Wextra main.cc 编译。

我在编译时或运行时的预期输出都是错误的。根据 cplusplus.com,在空字符串上调用 front() 是未定义的行为. 实际输出是Undefined:

问题

  1. 我可以在编译或运行时产生错误吗?如果不是,为什么编译器检测不到?
  2. 如果没有,是否有任何工具可以检测到这一点?例如,静态分析。

使用的版本:

$ clang++ --version
Apple LLVM version 9.0.0 (clang-900.0.37)
Target: x86_64-apple-darwin17.0.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

$ /usr/local/Cellar/gcc/7.2.0/bin/g++-7 --version
g++-7 (Homebrew GCC 7.2.0) 7.2.0
[Copyright Notice]

相关的相关问题:

最佳答案

将 Baum mit Augen 的链接变成答案

在使用 GCC 编译时添加标志 -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC。这不适用于 Clang。

这会在 std::basic_string 中启用运行时检查。

结果(为清楚起见添加了换行符):

$ /usr/local/Cellar/gcc/7.2.0/bin/g++-7 main.cc -g  -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
$ ./a.out
Undefined:
/usr/local/Cellar/gcc/7.2.0/include/c++/7.2.0/bits/basic_string.h:1077:
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::front()
[with _CharT = char; _Traits = std::char_traits<char>;
_Alloc = std::allocator<char>;
std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = char&]:
Assertion '!empty()' failed.
[1] 24143 abort ./a.out

关于c++ - Clang 未能检测到未定义的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46631366/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com