不确定为什么优化器会错误地优化我的方法

时间:2019-08-27 15:02:02

标签: c gcc

我是C语言的新手(所以我很有可能在做一些根本上是错的或坏的事情),并且正在研究kattis问题,https://open.kattis.com/problems/abc

我正在尝试看似GCC优化器,并且试图了解为什么或做错了什么。这是我能想到的最简单的复制案例:

#include <stdio.h>
#include <string.h>

int lookup(char input){
    // This will return 2 on invalid input.  Not ideal, but we don't have to worry about invalid inputs like that
    fprintf(stderr, "Asked to compare: %s\n", &input);
    if (strcmp("A", &input) == 0){
        //fprintf(stderr, "It's an A\n");
        return 0;
    } else if (strcmp("B", &input) == 0){
        //fprintf(stderr, "It's a B\n");
        return 1;
    } else {
        return 2;
    };
}

int main(void){
    char input[3];
    if (scanf("%3s", input) != 1){
        fprintf(stderr, "Something went wrong reading input\n");
        return -1;
    };
    printf("Desired Order: %s\n", input);
    printf("%d %d %d\n", lookup(input[0]),
        lookup(input[1]),
        lookup(input[2])
    );
}

用于触发此错误的示例输入文件只有一行:

CAB

如果我没有优化就编译:

$ cc -std=gnu11 -static -lm simple.c -o simple && cat input | ./simple
Desired Order: CAB
Asked to compare: B
Asked to compare: A
Asked to compare: C
2 0 1

启用优化后,请注意它会进入else部分:

$ cc -O2 -std=gnu11 -static -lm simple.c -o simple && cat input | ./simple
Desired Order: CAB
Asked to compare: B
Asked to compare: A
Asked to compare: C
2 2 2

到目前为止我已经注意到的事情:

  • 如果我在fprintf之后取消对strcmp("A", &input)的注释,即使启用了优化,代码也可以正常工作(这就是我想知道优化首先破坏代码的原因)。
  • 如果我在fprintf之后取消注释strcmp("B", &input),则优化后代码将失败。
  • 如果我注释掉“所需顺序:” printf,则即使进行了优化,代码也可以正常工作。

1 个答案:

答案 0 :(得分:4)

char input[3];

但是您在其中写了三个字符。空终止符还需要1个。

char input[4];

这里有

fprintf(stderr, "Asked to compare: %s\n", &input);

不。那不是一个字符串,所以我们想要一个字符

fprintf(stderr, "Asked to compare: %c\n", input);

我们也有

strcmp("A", &input) == 0

但是输入是char,所以我们想要

'A' == input

与“ B”相同