С++ Индексация строки TCHAR

Я занимаюсь статическим анализом некоторого старого кода C++, и мой C++ не самый сильный. У меня есть этот кусок кода:

void NIDP_clDPLogger::log(TCHAR *logString)
{
    TCHAR temp_logString[1024] = {0};
    _tcsncpy(temp_logString,logString,1024);
    temp_logString[1023] = NULL;
            ...

Инструмент статического анализа жалуется на то, что индексирует logString (параметр, передаваемый в функцию) в 1024, когда он может быть короче (размер варьируется, 1024 — это максимальный размер, я думаю). Поэтому я думаю, что мое исправление состоит в том, чтобы проверить размер logString и использовать его, например:

void NIDP_clDPLogger::log(TCHAR *logString)
{

    size_t tempSize = sizeof(logString);
    TCHAR temp_logString[tempSize] = {0};
    _tcsncpy(temp_logString,logString,tempSize);
    temp_logString[tempSize-1] = NULL;

Мне просто интересно, нормально ли это будет работать? Кто-нибудь может увидеть какие-либо недостатки/проблемы? Сборка и тестирование этого проекта немного сложны, поэтому я в основном просто ищу проверку работоспособности, прежде чем пройти через все это. Или есть лучший способ для меня сделать это? Могу ли я передать значение size_t в _tcsncpy, потому что раньше там было жестко заданное целое число?

Спасибо за помощь.


person DukeOfMarmalade    schedule 10.04.2012    source источник


Ответы (1)


sizeof(logString) вернет размер TCHAR*, а не размер переданного массива, поскольку массивы распадаются на указатели при передаче в качестве аргумента.

Если гарантируется, что logString завершается нулем, вы можете получить его длину, используя _tcslen(). В противном случае единственный способ узнать размер logString — это передать его в функцию в качестве другого аргумента.

person hmjd    schedule 10.04.2012
comment
ОК Спасибо миллион за это hmjd! - person DukeOfMarmalade; 10.04.2012