Я заранее прошу прощения за бесполезное название этого вопроса, но, похоже, ничто не подходит лучше.
Идея здесь состоит в том, чтобы скопировать argv
в другую переменную, по сути сделав его копию. Итак, основная идея того, что делает функция, заключается в том, чтобы использовать malloc()
, чтобы запросить некоторое пространство для копии, а затем выполнить итерацию по argv
, создавая копии каждого элемента.
Это код, с которым я работаю, среда разработки сейчас Visual Studio 2019 (даже если это не строго компилятор C...):
// Returns a copy of an array of strings (intended for argv, but should work with any of them):
wchar_t** copyArgv(size_t argc, wchar_t* argv[]) {
// Allocate space for the array of arguments:
wchar_t** argsCopy = malloc(((argc + 1) * sizeof(wchar_t*)));
if (!argsCopy)
return NULL;
// Copy each one of them:
for (size_t i = 0; i < argc; i++) {
argsCopy[i] = _wcsdup(argv[i]);
if (!argsCopy[i]) {
// Should also free any previous copied string I left that part out in the paste.
free(argsCopy);
return NULL;
}
}
argsCopy[argc] = NULL;
return argsCopy;
}
Я пробовал разные способы сделать копию argv, но каждый из них позволяет VS полагать, что может быть переполнение буфера, когда я делаю копию аргумента (строка: argsCopy[i] = _wcsdup(argv[i]);
) или считываю недопустимым данные в следующей строке, означающие чтение за пределами зарезервированного пространства.
Все это привело меня к мысли, что проблема заключается в (сейчас) единственном вызове malloc()
, чтобы зарезервировать пространство для массива аргументов.
И все же я бьюсь головой о стену, пытаясь понять, в чем проблема, я имею в виду, я думаю, что я требую достаточно места.
Я пробовал и другие компиляторы, последние стабильные версии Clang и GCC, похоже, не показывают такого предупреждения. Поэтому я решил спросить вас, бывалые программисты, можете ли вы обнаружить проблему или это какая-то ошибка компилятора (вряд ли, я уверен, что).
Для справки: точные предупреждения, которые выдает VS2019 (в 64-битной компиляции):
В назначении:
Переполнение буфера при записи в argsCopy: размер записи составляет "((argc + 1)) * sizeof (wchar_t *)", но может быть записано "16".
Следующая строка, тест для NULL:
Чтение недопустимых данных из argsCopy: читаемый размер составляет ((argc + 1)) * sizeof (wchar_t *) 'байтов, но может быть прочитано 16 байтов.