不同的结果编译gcc和clang

时间:2016-07-17 15:19:50

标签: c gcc clang

有人可以解释一下,为什么编译这段代码有不同的行为。例如,gcc具有无限循环,但clang按预期工作。

是的,我知道代码不仅仅是丑陋,几年前由我写的,只是想知道为什么切换机器会对这么简单的代码产生这样的影响,至少我没有使用堆栈,堆,指针什么都没有。

#include <stdio.h>
main()
{
    int a,b,state,nl,i,temp1,temp2;
    int words[10];
    nl = temp1 = 0;
    for( i = 0 ; i < 10 ; i++ )
        words[i] = 0; 
    while((a = getchar()) != EOF)
    {
        nl++;   
        if( a == ' ' || a == '\t' || a == '\n' )
        {
            words[nl-2]++;
            nl = 0;
        }
    }
    for(b=0; b < 10; b++)
        printf("%d",words[b]);
    printf("\n");
    for( b = 1 ; b <= 10 ; b++)
        printf("%d",b);
    printf("\n");
    for( b = 0 ; b <= 10 ; b++)
        if(words[b]>temp1)
            temp1=words[b];
    //printf("%d\n", temp1);
    for(; temp1 > 0 ; temp1--)
    {
        for(i= 0 ; i <= 10 ; ++i)
        {   
            if(words[i]>0)
            {
                //  temp2 = i;
                //  for(; temp2 > 0; temp2--)
                //  printf(" ");
                printf("#");
                words[i]--;
            }
            else
                printf(" ");
        }
        printf("\n");
    }
}

1 个答案:

答案 0 :(得分:4)

至少:

    words[nl-2]++;导致未定义的行为时,可以调用
  • nl == 1
  • 当访问数组越界的temp1=words[b];时,可以调用
  • b == 10
  • if(words[b]>temp1)将在b == 10时调用,if(words[i]>0)正在访问数组越界。
  • i == 10将在words[i]--;时调用,i == 10正在访问数组越界。
  • {{1}}可以在{{1}}时调用,它正在访问一个超出界限的数组。

通常,在给定未定义的行为时,不同的编译器会有所不同。