C 中循环错误导致堆栈缓冲区溢出

问题描述 投票:0回答:1

这是作业的一部分。

基本上,应该有“这些不是回文!”或“这些是回文!”出来了,但是每当我运行它并输入字符(尽管它编译得很好)时,它总是给我一个错误:堆栈缓冲区溢出。我想知道是否是

even_count
函数内的循环问题。

This frame has 1 object(s):
    [32, 62) 'pali_array' (line 30) <== Memory access at offset 95 overflows this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow /home/Execise in C/3.10.c:92 in even_count

原来的问题是: 编写一个程序,提示用户输入一个短语并判断它是否是回文。并且不要使用任何内置字符串处理函数,如 strlen() 和 strcmp()。

#include <stdio.h>
#include <assert.h>
#include <ctype.h>

int Check_Pali(char pali_array[30],int count);
void lower_conversion(char pali_array[30],int count);
int odd_count(char pali_array[30],int middle);
int even_count(char pali_array[30],int middle);

int main(void){
    char c;
    int flag;
    int count=0;
    char pali_array[30];
    int i;
    while((c=getchar()!='\n')){
        for(i=0;i<30;i++){
        //fill the array with getchar.
        pali_array[i]=c;
        count++;
        if(ispunct(pali_array[i])||isspace(pali_array[i])){
            i--;
            count--;
        }
        //putchar(pali_array[i]);
    }
    }

    flag=Check_Pali(pali_array,count);
    if(flag==1){
        printf("These are not Palindromes!\n");
        }
            else{
                printf("These are Palindromes!\n");
            }
}

int Check_Pali(char pali_array[30],int count){
    int middle;
    int flag;
    //Set all the letters to lower case.
    if(count%2==0){
        middle=(count)/2;
        flag=even_count(pali_array,middle);
        return flag;
    }else{
        middle=count/2;
        flag=odd_count(pali_array,middle);
        return flag;
    }
}
//Turn all the char into lower case.
void lower_conversion(char pali_array[30],int count){
    int i;
    for(i=0;i<count;i++){
        pali_array[i] = tolower(pali_array[i]);
    }
}
//when middle is an odd number.
int odd_count(char pali_array[30],int middle){
    int i;
    int flag=0;
    for(i=1;i<=middle;i++){
        if(pali_array[middle-i]!=pali_array[middle+i]){
            flag=1;
        }
    }
    return flag;
}
//when middle is an even number.
int even_count(char pali_array[30],int middle){
    int i;
    int j=1;
    int flag=0;
    for(i=0;i<middle;i++){
        if((pali_array[middle+i])!=pali_array[middle-j+1]){
            flag=1;
        }
        j++;
    }
    return flag;
}

程序编译正确,但是当我输入任何单词后,它就得到了

error:stack-buffer-overflow.

我使用的编译器是gcc,标志是:

cc -Wall -Wextra -Wfloat-equal -pedantic -Wvla -std=c99 -g3 -fsanitize=address -fsanitize=undefined
c stack-overflow
1个回答
1
投票

添加

printf("count:%d\n", count);
Check_Pali()
的开头显示,对于每个字母,计数都会增加 30。 所以我的猜测是,因为您将 for 循环放入 while 语句中,所以回文单词中的每个字母您的计数都会增加 30。 然后您尝试访问
paly_array[]
中比预期大的部分。

© www.soinside.com 2019 - 2024. All rights reserved.