铿锵优化bug?

时间:2011-09-21 15:59:46

标签: optimization 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 个答案:

答案 0 :(得分:9)

当然看起来像个臭虫。 Clang主线不显示这个(至少在darwin / x86-64上)。请在llvm.org/bugs上提交错误信息,详细说明如何重现这一点。堆栈溢出不是报告编译器错误的好地方:)

答案 1 :(得分:1)

肯定是一个错误。如果两个指针在if语句中相等,则它们在printf语句中也必须相等。