Как бороться со строковым вводом, который был выделен? - PullRequest
0 голосов
/ 14 апреля 2019

Я писал функцию, которая объединяет строки, когда обнаружил проблему во втором аргументе.Вот упрощенная версия моей функции

struct c_class* _Append_s(void* self, const char* str,const DWord length) // DWord is unsigned int
{
    struct c_class* this = self;

    this->inStr = realloc(this->inStr, length + this->len);
#pragma warning(disable:4996)
    strcpy(this->inStr + this->len, str);  // MSVC does an annoying warnings C4996
#pragma warning(default:4996)
    this->len += length;

    return this;
}

эта функция принимает struct c_class* в качестве входного аргумента (void* self), string для добавления и его length в байтах и ​​возвращает указатель структуры (это сделано для последовательных вызовов) struct c_class сама содержит char * inStr и длину строки.Но это не так.

В качестве входных данных _Append_s может принимать обычные константные строки char* in = "some text", массивы символов - char in[10], но также и выделенные строки char* inm = malloc(n).

Итаквопросы:

1) можно ли как-то отследить, какие строки выделены, и освободить их после объединения?Лучше было бы без дополнительного ввода, потому что это внутренняя функция, и я вызываю ее из упаковщиков типов int и char *.

2) возможно, есть способ преобразовать выделенную строку в выражение строки const и освободитьпамять потом?

Если второе возможно, первый вопрос устарел, потому что он решает проблему, где мне нужно получить законченную строку и освободить память, которая struct c_class* занимает

1 Ответ

0 голосов
/ 14 апреля 2019

Если вы хотите освободить массив символов, вам нужно всего лишь добавить free((char*)str); выше return this; Но, возможно, я вас не правильно понял.

Как указал Джон Хамфрис - w00te в этом ответе https://stackoverflow.com/a/12204279/6911200, предупреждение C4996 означает:

Функция strcpy считается небезопасной из-за того, что проверка границ не выполняется и может привести к переполнению буфера.

Следовательно, как следует из описания ошибки, вы можете использовать strcpy_s вместо strcpy:

strcpy_s( char *strDestination, size_t numberOfElements,
const char *strSource );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...