2010-08-10 4 views
1

В документации для TB_GETBUTTONTEXT указано, что обработчик должен возвращать количество символов и необязательно (если lParam не является нулевым) скопировать строку в предоставленный буфер.Кто несет ответственность за установку нулевого терминатора при обработке TB_GETBUTTONTEXT?

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

Должен ли обработчик скопировать завершающий нуль? Я имею в виду, если в первый раз обработчик возвратил N, а выделенное место для вызывающего абонента для N символов и обработчик добавляет завершающий нуль, тогда происходит переполнение буфера. Но если вызывающий абонент действительно ожидал, что строка будет иметь нулевой конец и выделено место для символов N+1, и обработчик не добавит нулевой ограничитель, обработчик будет иметь строку, которая не завершена нулем, и снова может произойти переполнение буфера (если вызывающий не является достаточно осторожным).

А что должен делать обработчик? Должен ли он скопировать нулевой ограничитель или нет?

ответ

2

MFC использует разумный подход в реализации CMFCToolBar :: OnGetButtonText(), он предполагает, что вызывающий абонент знает, что он должен выделить N + 1 и использует lstrcpy() для копирования текста.

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