c - 我遇到了 "Buffer overflow-array index out of bounds"错误

标签 c c-strings strcpy strcat strncpy

我确实理解该错误,但不知道正确的解决方案是什么。它说

Array 'filename' of size 512 may use index value(s) MIN..1022

是不是因为strncat是在strncpy之后调用的?

我尝试执行 strlen,但这引入了一些其他错误。

#define MAX_SIZE 512
void some_function(const char *path)        /*path is also char  
                                             array of size 512*/  
{

    char filename[MAX_SIZE]="";
    char *attr = "/funct";

    strncpy(filename, path, sizeof(filename));
    strncat(filename, attr, sizeof(filename));  //error line

}

有没有合适的解决方案。

最佳答案

如果您使用函数strncpy,那么您必须将其最后一个字符设置为零字符“\0”。否则无法保证字符数组中包含字符串。

以这种方式使用strncat

strncat(filename, attr, sizeof(filename));

没有意义。数组filename 可能没有足够的空间来容纳字符串attr。但是您正在尝试将 sizeof(filename) 字符复制到已经可以完全填充的数组中。

您必须“手动”检查目标数组是否包含足够的空间来将新字符串附加到已存储的字符串中。

因此使用函数 strncat 是没有意义的,因为在任何情况下结果路径都将无效。

您可以使用下面演示程序中所示的方法。

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

#define MAX_SIZE 512

void some_function(const char *path )
{
    char filename[MAX_SIZE] = "";
    const char *attr = "/funct";
    size_t n = strlen( attr );

    strncpy( filename, path, sizeof (filename ) );

    filename[ MAX_SIZE - 1] = '\0';

    if ( n < MAX_SIZE - strlen( filename ) )
    {
        strcat( filename, attr ); 
    }

    puts( filename );
}

int main(void) 
{
    const char *path = "/path";

    some_function( path );

    return 0;
}

或者您可以在函数的最开始检查数组是否可以包含这两个字符串。例如

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

#define MAX_SIZE 512

void some_function(const char *path )
{
    char filename[MAX_SIZE] = "";
    const char *attr = "/funct";
    size_t n1 = strlen( path );
    size_t n2 = strlen( attr );

    if ( n1 + n2 < MAX_SIZE )
    {
        strcpy( filename, path );

        strcpy( filename + n1, attr ); 
    }

    puts( filename );
}

int main(void) 
{
    const char *path = "/path";

    some_function( path );

    return 0;
}

关于c - 我遇到了 "Buffer overflow-array index out of bounds"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57081303/

相关文章:

c - 获取主机的protobyname

c++ - 我如何布局混合 C 和 C++ 的函数原型(prototype)

c - 不明白为什么会出现段错误

c++ - 为什么在遗留 strcpy() 中没有健全性检查

c - malloc 和 strcpy 交互

c - 在C中合并多个整数范围的数据结构和算法

c# - 从 C# 调用 C 函数时如何处理可选结构参数

mysql - 将自定义字符串传递到 MariaDB/MySQL C 连接器 API 函数时出现 "unknown column in field list"错误

c - 从C中的字符串求解数学

c - 修复 AddressSanitizer : strcpy-param-overlap with memmove?