Ошибка оптимизации clang? - PullRequest
       2

Ошибка оптимизации clang?

2 голосов
/ 21 сентября 2011

Я пытался отследить то, что похоже на ошибку в 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);
}

Когда я компилирую его с оптимизацией, в Clang, включенном в загрузку XCode («Apple Clang 2.1»):

clang++ -Os optimizebug.cpp

И запустите его, этосообщает:

6b6f2be3 == 6b6f2be2! Really?

Это кажется мне немного странным, если не сказать больше.Если я уберу приведение (без знака) в x_Is_Digit, оно будет работать правильно.

Я столкнулся с ошибкой в ​​clang?Или я делаю что-то здесь, что вызывает какое-то неопределенное поведение?Если я скомпилирую его с -O0, у меня не возникнет проблемы.

Ответы [ 2 ]

9 голосов
/ 22 сентября 2011

Конечно, для меня это ошибка. Главная линия Clang не отображает это (по крайней мере на darwin / x86-64). Пожалуйста, отправьте сообщение об ошибке на сайте llvm.org/bugs с подробной информацией о том, как воспроизвести это. Переполнение стека - не лучшее место, чтобы сообщать об ошибках компилятора:)

1 голос
/ 21 сентября 2011

Определенно ошибка.Если два указателя равны в операторе if, они также должны быть равны в выражении printf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...