【问题标题】:clang optimization bug?铛优化错误?
【发布时间】:2011-09-21 15:59:45
【问题描述】:

我一直在尝试找出看起来像是 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 编译它,我不会得到问题。

【问题讨论】:

    标签: optimization clang


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        • 2016-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        相关资源
        最近更新 更多