2016-11-15 4 views
0

Пример кода для Retrieving the Last-Error Code на MSDN показывает этот код:Почему добавляется 40 к размеру, переданному LocalAlloc?

lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, 
    (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); 

, который используется позже в

StringCchPrintf((LPTSTR)lpDisplayBuf, 
    LocalSize(lpDisplayBuf)/sizeof(TCHAR), 
    TEXT("%s failed with error %d: %s"), 
    lpszFunction, dw, lpMsgBuf); 

Мне очень интересно узнать, почему именно это добавляется?

Это какой-то запас прочности? Или Microsoft пытается рассказать нам что-то о StringCchPrintf? Или что-то другое?

+6

Вам нужно место для всех возможных цифр 'dw', плюс текстовое сообщение. '40' может быть немного переполнен, но не сильно. –

+0

Это практика, преподаваемая в Школе жестких ударов. Кто-то собирается локализовать строку и в значительной степени гарантированно забыть обратить внимание на число. StringCchPrintf() всегда будет держать его в беде, но все же некоторые шансы на сообщение об ошибке в Германии :) –

ответ

4

Учитывая формат строки %s failed with error %d: %s, имеется 21 символ текста (" failed with error " и ": "). Самое длинное представление кода ошибки (0x8FFFFFFF или -1879048193 в десятичной форме) составляет 11 символов. Возьмите другого символа для нулевого терминатора, и вы получите в общей сложности 33 символа, а также длину двух входных строк. Таким образом, код перекрывает пространство для 7 символов.

Это может означать, что автор спешил, оценил размер требуемого буфера, слегка переоценил его на всякий случай или технический писатель, исправляющий текст ошибки без учета его кода.

Мы действительно не знаем, но если вы используете Visual Studio и не хотите самостоятельно выполнять математику, вы можете заставить CRT сделать это за вас, вызвав любое из семейств функций _vsctprintf. Мало того, что он невосприимчив к изменениям в строках формата, он также документирует намерение автора до такой степени, когда вопросы не остаются без ответа.

 Смежные вопросы

  • Нет связанных вопросов^_^