将字符串复制到另一个字符串Valgrind safe

时间:2016-05-29 15:16:35

标签: c

今天早些时候我问了一个关于我得到的valgrind错误的问题,因为我没有解决方案,我将不得不尝试以另一种方式找到解决方案。

int login(char* input, int input_length)

这是我有atm的函数原型。 我将得到一个输入,应该是base64编码,所以我解码它(该函数工作并生成没有错误)并将返回的char *保存到一个新的char *(函数calloc&#39的内存返回) 。

理想情况下,结束返回(如果用户输入的格式正确)应该如下所示

username:password

我如何可靠地找到':'并在2个不同的char *指针中复制用户名和密码。我知道我必须动态(取决于两者的长度)分配内存。我也知道如何获取用户名,粗略代码:

int temp;
char* username;
char* buffer;
buffer = strchr(input, ':');
temp = strlen(input) - strlen(buffer);
username = calloc(temp, sizeof(char));
strncpy(username, input, temp);

现在缓冲区指的是':'我不知道char会跟着什么,如果有的话。我现在怎么能在没有未经传播的变量风险的情况下获得密码?

旁注:我将检查输入是否为NULL,如果为NULL,则检查已解码的char *,如果两者为真,则该函数以返回结束。

char* decoded = NULL; //So it doesn't point to memory i don't "own"
if(input != NULL) {
    decoded = base64_decode(input, input_length);
}
passlocation = strchr(decoded, ':');

1 个答案:

答案 0 :(得分:2)

您需要复制null终止符,并将其添加到遗漏的位置。

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

int 
main(void)
{
    const char *input = "user:password";

    char *separator;
    char *user;
    char *password;
    size_t length;

    separator = strchr(input, ':');
    if (separator == NULL) // No separator
        return -1;
    // Compute the length using pointer arithmetic
    length = (ptrdiff_t) (separator - input);
    if (length == 0) // Separator is the first character
        return -1;
    user = malloc(length + 1);
    if (user == NULL) // Cannot allocate memory
        return -1;
    user[length] = '\0'; // Always Remember the `null` terminator
    memcpy(user, input, length);

    password = strdup(separator + 1);
    if (password != NULL)
        fprintf(stdout, "User: %s\nPassword: %s\n", user, password);
    free(password);
    free(user);

    return 0;
}