Clang 优化 bug?

3

我一直在尝试追踪Clang中的一个错误,并且我认为我已经找到了一个相对较小的复现方式。这是我的程序:

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

#define x_Is_Digit(x)       isdigit((unsigned char) (x))

void        Odd_Behavior(char * version)
{
    char * ptr, *tmp;

    for (ptr = version; x_Is_Digit(*ptr); ptr++);
    ptr++;

    for (tmp = ptr; x_Is_Digit(*ptr); ptr++);
    if (ptr == tmp)
        printf("%08x == %08x! Really?\n", ptr, tmp);
}

int main()
{
    char buffer[100];
    strcpy(buffer, "3.8a");
    Odd_Behavior(buffer);
    return(0);
}

当我使用Xcode下载的clang编译器(“Apple clang 2.1”)进行优化编译时:

clang++ -Os optimizebug.cpp

并运行它,它会报告:
6b6f2be3 == 6b6f2be2! Really?

这对我来说有点奇怪,至少可以这么说。如果我在x_Is_Digit中删除(unsigned char)强制转换,它就正常工作。

我是遇到clang的一个错误吗?还是我的操作引发了某种未定义的行为?如果我使用-O0编译,问题就不会出现。

2个回答

9

在我看来,这肯定是个bug。Clang主线版本没有显示这个问题(至少在darwin/x86-64上)。请在llvm.org/bugs上提交一个bug并提供完整的详细信息,以便重现此问题。堆栈溢出不是报告编译器错误的好地方 :)


1

这明显是一个Bug。如果在if语句中两个指针相等,那么在printf语句中它们也必须相等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接