strcmp returns -fsanitize=address 下的不同结果

Strcmp returns different result under -fsanitize=address

我正在使用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 提供了一个包装器来检测内存溢出。 Their version returns 仅 -1、0 或 +1(仍然是 standards-compliant)。