这个缓冲区溢出解决方案有什么问题?

Cra*_*ygL 0 c buffer-overflow

我刚刚在课程上标记了这个错误的解决方案,在c中缓冲区溢出但是没有提供关于它是如何错误的反馈.有人能让我知道问题是什么吗?谢谢.

该问题提出了一个解决方案,以防更长的字符串传递给此函数:

void function(char *str)
{
    char buffer[16];
    strcpy(buffer, str);
}
Run Code Online (Sandbox Code Playgroud)

这是我的解决方案

void function(char *str)
{
    size_t str_length = strlen(str);

    char buffer[str_length];
    strcpy(buffer, str);
}
Run Code Online (Sandbox Code Playgroud)

谢谢

JS1*_*JS1 11

您需要考虑终止字符串的空字符:

char buffer[str_length + 1];
Run Code Online (Sandbox Code Playgroud)

Void_ptr指出上述是不够的.所以要更强大:

void function(char *str)
{
    size_t str_length = strlen(str);
    char *buffer = malloc(str_length + 1);
    if (buffer == NULL)
        return;
    memcpy(buffer, str, str_length+1); // Thanks chux
    // Do something with with buffer...
    free(buffer);
}
Run Code Online (Sandbox Code Playgroud)

或许教授只是在寻找这个:

void function(char *str)
{
    char buffer[16];
    strncpy(buffer, str, sizeof(buffer));
    buffer[sizeof(buffer)-1] = '\0';
}
Run Code Online (Sandbox Code Playgroud)