clang optimization bug?



我一直在努力追踪clang中的一个bug,我想我已经得到了一个合理的最小复制。下面是我的程序:

#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中遇到bug了吗?还是我在这里做的事情导致了某种未定义的行为?如果我用- 0编译它,我不会得到这个问题。

在我看来肯定是个bug。Clang主线不会显示这个(至少在darwin/x86-64上)。请在llvm.org/bugs上提交一个bug,详细说明如何复制这个bug。堆栈溢出不是报告编译器错误的好地方:)

绝对是个bug。如果两个指针在if语句中相等,那么它们在printf语句中也必须相等。

最新更新