Как C компилятор `-O0` делает код go таким безумным? - PullRequest
0 голосов
/ 15 марта 2020

Пожалуйста, обратите внимание на: https://godbolt.org/z/WGBP8D

Код:

    size_t n;
    scanf("%d", &n);
    fprintf(stderr, "(1 <= %d) == %d\n", n, 1 <= n);
    fprintf(stderr, "(%d <= 1000) == %d\n", n, n <= 1000);
    fprintf(stderr, "%d\n", 2 <= 1000);
    ASSERT(1 <= n && n <= 1000);

Ввод установлен на:

2
1
2

Вывод:

(1 <= 2) == 1
(2 <= 1000) == 0
1
Assertion failed: 1 <= n && n <= 1000

Закомментирование дальнейшей части кода изменяет поведение приведенного выше фрагмента. Как это?

Забавно, любая активированная оптимизация (-O1) работает хорошо, но никакая оптимизация (-O0 или не указано) делает это ... Ну, я даже не знаю как чтобы понять это.

1 Ответ

4 голосов
/ 15 марта 2020

scanf влияет только на нижние 32 бита 64-битного n . printf также отображает только эти нижние 32 бита, но с некоторой оптимизацией в верхних 32-битах что-то есть, что делает n больше 1000, отсюда и строка вывода:

(2 <= 1000) == 0

Использование -Wall, вероятно, предупредит вас о проблеме.

...