C语言 字符串反转和缓冲区溢出

hrysbysz  于 2022-12-22  发布在  其他
关注(0)|答案(2)|浏览(157)

我创建了一个反转字符串的函数。
我知道这个函数的代码已经可以在网上找到了,但是我开始用C语言开发,我想做我的函数来理解我在做什么。
我的代码:

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

char* reverseString(char* chaineFonc);
    
    char* reverseString(char* chaineFonc)
    {
        // Initialization
        int stringLength = strlen(chaineFonc);
        char* response = (char*)malloc((stringLength + 1) * sizeof(char));
        int numCarac = stringLength - 1;
    
        // For each Character in the String
        for (int i = 0; i < stringLength; i++)
        {
            // Memorization
            response[i] = chaineFonc[numCarac];
    
            // Decrement
            numCarac--;
        }
        // End - For each Character in the String
    
        // Finalization
        response[stringLength] = '\0';
    
        return response;
    }

    int main(int nbArg, char** listeArg)
    {
        printf("\n%s",reverseString("ABCDEFGHIJKLMN"));
    }

这段代码可以工作,但是在Visual Studio下出现了一个警告,指出当我使用这段代码response[stringLength] = '\0';时出现了缓冲区溢出
我不明白为什么。
警告:

    • Avertisement C6011**删除空指针"响应"。(取消引用空指针"响应")
    • Avertissement C6386**删除'response'上的记录。(写入'response'时缓冲区溢出)
7xllpg7q

7xllpg7q1#

您应该告诉我们您正在运行静态代码分析,这可能会给您以下警告:

C:\Users\XXX\main.c(30): warning C6386: Buffer overrun while writing to 'response':  the writable size is '((stringLength+1))*sizeof(char)' bytes, but 'stringLength' bytes might be written.
C:\Users\XXX\main.c(30): warning C6011: Dereferencing NULL pointer 'response'.

您会收到警告C6011,因为response可能是NULL,因为malloc可能返回NULL指针,尽管这种情况不太可能发生,特别是当allocaterd大小非常小时。
您可以通过添加一些代码来消除此警告:

...
char* response = (char*)malloc((stringLength + 1) * sizeof(char));

if (response == NULL)  // <<< add this
  exit(1);             // <<< add this

int numCarac = stringLength - 1;
...

警告C6386确实是微软静态代码分析器的一个错误,我没有看到这个代码有任何问题。特别是下面的错误信息是矛盾的:

`the writable size is '((stringLength+1))*sizeof(char)' bytes,
 but 'stringLength' bytes might be written`
r1wp621o

r1wp621o2#

看起来您正在使用malloc函数为响应数组分配内存,但您没有检查malloc的返回值以确保它成功。malloc函数返回一个指向已分配内存的指针,如果它无法分配所请求的内存量,则返回NULL。
在使用malloc分配的内存之前,你应该检查它的返回值。下面是一个例子来说明你是如何做到这一点的:

char* response = (char*)malloc((stringLength + 1) * sizeof(char));
if (response == NULL) {
    fprintf(stderr, "Error: Unable to allocate memory.\n");
    return NULL;
}

这将防止在malloc无法分配所请求的内存时发生缓冲区溢出。
此外,你还应该考虑使用calloc函数来代替malloc,因为它会将分配的内存初始化为零,这在某些情况下会很有用。使用calloc的语法与malloc类似,但它需要两个参数:要为其分配内存的元素的数量以及每个元素的大小。
例如:

char* response = (char*)calloc(stringLength + 1, sizeof(char));
if (response == NULL) {
    fprintf(stderr, "Error: Unable to allocate memory.\n");
    return NULL;
}

相关问题