2011-09-21 99 views
2

我一直在试图追踪叮当中的错误,我认为我已经有了相当小的重现。这是我的计划:铛优化错误?

#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的下载铛( “苹果铛2.1”):

clang++ -Os optimizebug.cpp 

并运行它,它会报告:

6b6f2be3 == 6b6f2be2! Really? 

这让我觉得有点奇怪,至少可以说。如果我删除x_Is_Digit中的(unsigned char)强制转换,它将正常工作。

我遇到了叮当中的错误吗?或者我在这里做些什么导致某种未定义的行为?如果我用-O0编译它,我不会解决问题。

回答

9

当然看起来像我的错误。锵主线不显示此(至少在达尔文/ x86-64)。请在llvm.org/bugs上提供错误,并提供有关如何重现此问题的完整详细信息。堆栈溢出不是报告编译器错误的好地方:)

1

明确的错误。如果在if语句中这两个指针相等,则它们在printf语句中也必须相等。