Strcmp 在 -fsanitize=address 下返回不同的结果

2023-12-20

我正在使用 gcc (SUSE Linux) 7.2.1 20171020 编译以下 C 程序 strcmp.c:

#include <stdio.h>
#include <string.h>

int main () {
   char str1[] = "e";
   char str2[] = "pi";
   int ret;

   ret = strcmp(str1, str2);

   printf("val: %i\n", ret);

   return(0);
}

我用以下方法编译:

gcc -Wall -Wextra -fsanitize=address  strcmp.c

当我运行它时,我得到:

./a.out
val: -1

这对我来说是一个惊喜,我本来预计结果是-11。事实上,当我按以下方式编译程序时,我得到了这一点:

gcc -Wall -Wextra  strcmp.c

为什么要给予选择-fsanitize=address改变结果?


Asan 提供了一个包装器strcmp来检测内存溢出。他们的版本 https://github.com/llvm-mirror/compiler-rt/blob/77712da5be6ad0e4483747826547756c15d1f4c3/lib/sanitizer_common/sanitizer_common_interceptors.inc#L422仅返回 -1、0 或 +1(仍然符合标准)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Strcmp 在 -fsanitize=address 下返回不同的结果 的相关文章

  • Xcode - 配置:错误:在 $PATH 中找不到可接受的 C 编译器

    从头开始重建 Mac 安装了 xcode 和 rvm 然后尝试安装 rubies 但它们都给了我 Error running configure prefix Users durrantm rvm rubies ruby 1 9 3 p12
  • 编译器特定的内存初始化

    有没有办法保证整个程序中某些对象的静态对象初始化顺序 我有内存分配器 我希望将其作为程序中的第一件事进行分配 因为它们将在整个程序的其他地方使用 并且我想使用这些分配器来分配所有后续内存 我知道这可能是特定于编译器的 因为我不相信 C 标准
  • 我需要一个树转储选项,该选项在当前的 gcc 版本中不再存在

    旧版本的 GCC 例如 4 0 2 或 4 1 2 有该选项 df see 用于调试程序或 GCC 的选项对于4 1 2 http gcc gnu org onlinedocs gcc 4 1 2 gcc Debugging Options
  • g++、colorgcc 和 ccache

    尝试结合 ccache 和 colorgcc 下列的链接文本 http wiki tudos org Gcc stack 我的 g 是到 colorgcc 的软链接 colorgccrc 包含行 g ccache usr bin g 运行
  • 使用 -ffile-prefix-map 会中断调试

    在 DAYJOB 我正在尝试实现可重复的构建 以使调试已发布的软件变得更容易 我们的构建服务器上不再有完整的调试版本 使用来自可重现的构建 org https reproducible builds org 使用 ffile prefix
  • 通过 VLA 数组跳转到 goto 时出现分段错误

    以下示例演示了该问题 include
  • C 中的分段错误

    我需要用 0 填充二维数组 但编译后的程序会出现此错误 怎么了 int main int vert 1001 1001 int hor 1001 1001 int dudiag 1416 1416 int uddiag 1416 1416
  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include
  • 为什么编译器可以假设全局变量的地址适合 32 位? [复制]

    这个问题在这里已经有答案了 当查看汇编器时 参见上帝螺栓 org https godbolt org z ZQnXFo 这个简单的函数 extern int global void doit int void call doit doit
  • 如何使用现代 GCC 抑制“-fpermissive”错误?

    我正在尝试编译一些不合格的代码C 17 https en wikipedia org wiki C 2B 2B17 但我遇到了以下问题 pragma GCC diagnostic push pragma GCC diagnostic ign
  • MSVC 可能/不太可能等效

    GCC 编译器支持 builtin expect 语句 用于定义可能和不可能的宏 eg define likely expr builtin expect expr 1 define unlikely expr builtin expect
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • 如何用gcc进行矢量化?

    v4系列的gcc编译器可以使用以下方法自动向量化循环SIMD http en wikipedia org wiki SIMD某些现代 CPU 上的处理器 例如 AMD Athlon 或 Intel Pentium Core 芯片 这是怎么做
  • 是否有与 gcc --kill-at 等效的 Visual C++?

    也就是说 DLL 名称末尾有一个额外的 8 这会造成问题 显然 在 gcc 中使用 kill at 标志可以解决这个问题 但我找不到任何类似的 MSVC 建议 编辑 更多信息 我试图让 C JNI dll 工作 但我总是得到 线程 Thre
  • 隐式转换和编译器的不同行为

    Motivated by this question https stackoverflow com q 51972738 5800831 I created the following code struct X X int struct
  • 在 Objective-C 中使用 GCC C 扩展(语句表达式)进行初始化 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 GNU C 提供了标准 C 中没有的多种语言功能 这些扩展在 C 和 Objective C 中都可用 有一个 GCC C 扩展 称为语句表达式
  • std::thread::id 的 std::operator== 中的分段错误

    我遇到了一个问题 我不确定如何解决 我相信这是 GCC 和 或 libstdc 中的问题 我正在运行 Ubuntu 14 04 LTS 和 GCC 4 8 2 19ubuntu1 libstdc 3 4 19 我相信 如何找到 Linux
  • 使用 GNU C 内联汇编在 VGA 内存中绘制字符

    我正在学习使用 C 和内联汇编在 DOS 中进行一些低级 VGA 编程 现在我正在尝试创建一个在屏幕上打印出字符的函数 这是我的代码 This is the characters BITMAPS uint8 t characters 464
  • 列出目标文件中未定义的引用

    所以我正在用 g 构建一堆模块 我使用 c 命中一些源文件来生成 o 目标文件 然后 我有时会使用 ld 的 r 标志组合目标文件 以生成更多 o 文件 在此过程中的某个地方 某个功能没有被包含在内 所以我想做的是找到一个快速工具 它可以查
  • C 十六进制常数类型

    我写了以下c代码 include

随机推荐