StringCbPrintf скрывает ошибки, конвертируя $ cc% cc ... в \ 0 - PullRequest
0 голосов
/ 23 октября 2019

Я работаю со строковыми буферами, и у меня есть некоторые функции, заполняющие эти буферы. У меня также есть несколько модульных тестов, чтобы утверждать, что эти буферы заполнены правильно.

Одна из этих функций использует функцию Windows API

StringCbPrintfA(ansistr , sizeof(ansistr), "%S", wstr); 

для преобразования строки Юникода в строку ANSI C.

Суть в том, что в буфере Unicode содержится не завершенная строка wchar, полученная из функции winusb WinUsb_GetDescriptor. Это всегда имеет место с этой функцией winusb. Таким образом, ожидается отсутствующее завершение.

Однако функция StringCbPrintfA по-прежнему преобразует некорректно завершенную широкую строку в правильно завершенную строку ANSI C. Как? В сборке DEBUG все буферы инициализируются с 0xCC во время выполнения Windows. Похоже, что это заставляет StringCbPrintfA правильно завершить строку ANSI.

В сборке RELEASE буферы не инициализируются 0xCC, и StringCbPrintfA НЕ завершает строку ANSI правильно.

Решение очевидно: заполните все рабочие буферы нулями, чтобы обеспечить правильное завершение строки. Тогда все работает в DEBUG и RELEASE.

К сожалению, я хочу защитить код от проблем регрессии, и моя проблема сейчас в том, что мои модульные тесты (с использованием среды Multithreaded-Debug (/ MTd)) успешно выполняются при неправильных обстоятельствах, потому что они получают правильно завершенные строки вПостроение отладки, даже если инициализация нулевого буфера была забыта. Конечно, они не должны проходить.

Теперь мой вопрос:

Как я могу решить этот узел?

...