Возможное переполнение буфера во время конкатенации строк - PullRequest
1 голос
/ 18 июня 2011

Я новичок в C ++. Моя программа не работает, и я пытаюсь выяснить, почему. В какой-то момент кода я генерирую случайное число и копирую файл с исходным именем файла, за которым следует число

char CopyPath[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_MYMUSIC, NULL, 0, CopyPath);
int randomNumber = 101 + rand()%1000000000;
char randomBuffer[15];
itoa(randomNumber, randomBuffer, 10);

char computerName[MAX_COMPUTERNAME_LENGTH+1];
DWORD size = MAX_COMPUTERNAME_LENGTH;
if(!GetComputerName(computerName, &size))
    strcat(computerName, "FAIL");
strcat(CopyPath,"\\");
strcat(CopyPath, computerName);
strcat(CopyPath, "-");
strcat(CopyPath, randomBuffer);
copyFile(oldpath, CopyPath);

Я подозреваю, что где-то здесь произошел сбой. Мой вопрос заключается в том, что, поскольку я не объявил все значения CopyPath, происходит сбой. Должен ли я объявить это как

char CopyPath[MAX_PATH] = {'\0'}

Может ли это быть проблемой ??

Ответы [ 4 ]

2 голосов
/ 18 июня 2011
if(!GetComputerName(computerName, &size))
    strcat(computerName, "FAIL");

Это должно быть strcpy, поскольку в computerName нет допустимой строки для добавления.

Кроме того, вы, вероятно, должны звонить SHGetFolderPathA, так как выпередают буфер char (а не TCHAR).

0 голосов
/ 18 июня 2011

Я полагаю, вы поняли из других комментариев, что ваш код не очень хорош (по крайней мере, из-за стиля и возможных переполнений буфера).

Принимая во внимание только ваш конкретный вопрос - вы правы - проблема в неинициализированном массиве char, который не представляет C-строку, потому что он должен заканчиваться нулем.Как вы, наверное, знаете, strcat работает на C-строках.Поэтому изменение с:

  char CopyPath[MAX_PATH]; // this is not a C-string

на

  char CopyPath[MAX_PATH] = {0}; // this is a C-string (empty though)

решит эту конкретную проблему.

РЕДАКТИРОВАТЬ: этот подход следует использовать с любымбуфер, который вы собираетесь использовать с strcat в качестве цели конкатенации, которая в вашем случае равна computerName

0 голосов
/ 18 июня 2011

Не уверен, что вызывает сбой в вашем случае.Я думаю, что это должно быть проблема переполнения буфера.Считаете ли вы пространство для символа окончания \0 в константе MAX_PATH?

0 голосов
/ 18 июня 2011

Для хранения строковой информации предпочитайте использовать std :: string, чем массив C, так как она обеспечивает правильное копирование и конкатенацию через операторы = и +.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...