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

时间:2015-05-19 00:20:54

标签: c buffer-overflow

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

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

void function(char *str)
{
    char buffer[16];
    strcpy(buffer, str);
}

这是我的解决方案

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

    char buffer[str_length];
    strcpy(buffer, str);
}

由于

2 个答案:

答案 0 :(得分:11)

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

char buffer[str_length + 1];

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);
}

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

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

答案 1 :(得分:1)

这取决于你可以使用什么,但我想最安全的方法是使用strdup并检查它是否返回NULL。

void function(char *str)
{
    char *buffer;

    buffer = strdup(str);
    if (!buffer)
        exit(EXIT_FAILURE);
    free(buffer);
    /* free buffer or keep track of it or you'll end up with memory leaks */
}

如果您不允许动态分配内存,则使用strncpy仍然是strcpy的一种更安全的替代方法。

void function(char *str)
{
    size_t str_length = strlen(str);
    char buffer[str_length + 1]; /* /!\ This is C99 */

    strncpy(buffer, str, str_length);
    buffer[str_length] = '\0';
}