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

Gcc Strcmp在-fsanize=address下返回不同的结果,gcc,address-sanitizer,Gcc,Address Sanitizer,我正在使用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(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);
}
当我运行它时,我得到:

./a.out
val: -1
这对我来说是一个惊喜,我本以为结果是-11。事实上,当我用以下方式编译程序时,我得到了:

gcc -Wall -Wextra  strcmp.c

为什么给选项
-fsanize=address
会改变结果?

Asan为
strcmp
提供了一个包装器来检测内存溢出。仅返回-1、0或+1(这仍然符合标准)。

为什么希望从
strcmp()
得到任何特定的返回值?只有它的(非)零度和符号是有意义的,这两种情况对你来说都是一样的。@JohnBollinger,谢谢。我想我误读了《曼彻斯特皇家骑警》,以为会有“距离”。如果你把你的评论变成一个答案,我会接受。我认为理解ASAN如何“改变”生成的代码仍然是一个有趣的问题。我同意,@P.P.,这就是为什么我评论而不是回答。要回答实际问题,需要分析或事先熟悉glibc实现的细节,我恐怕目前还没有足够的动力去深入研究这个问题。如果字符串对齐,glibc会使用逐字逐句的操作以不同的方式(更好)处理字符串。很可能是
-fsanize=address
导致字符串常量对齐。谢谢,至少这教会了我更仔细地阅读strcmp手册页。
gcc -Wall -Wextra  strcmp.c