Проблемы переполнения буфера VC ++ - PullRequest
0 голосов
/ 23 апреля 2010

Когда я выполняю свой код, я получаю эту ошибку

LPTSTR lpBuffer;
::GetLogicalDriveStrings(1024,lpBuffer);
while(*lpBuffer != NULL)
{
  printf("%s\n", lpBuffer); // or MessageBox(NULL, temp, "Test", 0); or whatever
  lpBuffer += lstrlen(lpBuffer)+1;
  printf("sizeof(lpBuffer) %d\n",lstrlen(lpBuffer));
}

Мощно

C

sizeof (lpBuffer) 3

D

sizeof (lpBuffer) 3

E

sizeof (lpBuffer) 3

F

sizeof (lpBuffer) 0

Ответы [ 3 ]

0 голосов
/ 23 апреля 2010

Вы должны передать адрес памяти, куда будет скопирована строка.Однако вы не выделили места для хранения символов.Вам нужно выделить место перед передачей его функции GetLogicalDriveStrings.Вы можете выделить память в куче, как предложено @Windows programmer или, если максимальная длина строки известна во время компиляции, вы можете выделить ее в стеке, используя TCHAR lpBuffer[1024]; Additinally, вы используете printf для печати Unicodeкак это зависит от флага компилятора).Это не будет работать и будет печатать только первый символ.

0 голосов
/ 23 апреля 2010

Вы должны фактически передать в буфер - обратите внимание, что размер буфера, который вы передаете, должен быть на единицу меньше, чем фактический размер буфера, чтобы учесть окончательный завершающий символ '\ 0' (я понятия не имею, почему API был разработан так).

Вот немного измененная версия вашего примера:

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

enum {
    BUFSIZE = 1024
};

int _tmain (int argc, TCHAR *argv[])
{
    TCHAR szTemp[BUFSIZE];
    LPTSTR lpBuffer = szTemp;   // point lpBuffer to the buffer we've allocated


    szTemp[0] = _T( '\0');  // I'm not sure if this is necessary, but it was
                            //   in the example given for GetLogicalDriveStrings()

    GetLogicalDriveStrings( BUFSIZE-1, lpBuffer);   // note: BUFSIZE minus 1

    while(*lpBuffer != _T('\0'))
    {
      _tprintf( _T("%s\n"), lpBuffer);
      lpBuffer += lstrlen(lpBuffer)+1;
      _tprintf( _T("length of lpBuffer: %d\n"),lstrlen(lpBuffer));
    }

    return 0;
}
0 голосов
/ 23 апреля 2010

lpBuffer указывает на случайную память.Вам нужно что-то вроде этого:

LPTSTR lpBuffer = new TCHAR[1025];

edit: исправлен размер массива 1025 вместо 1024, потому что параметр length равен 1024. Этот API требует внимательного чтения.

...