О строковых безопасных функциях Microsoft - PullRequest
1 голос
/ 19 августа 2010
WCHAR* someString = L"SomeString\n";
WCHAR s1[MAX_PATH];

// I'm sure this is right code.
StringCchCopyW(s1, _countof(s1), someString);

// But I'm not sure about these example.
StringCchCopyW(s1 + 100, _countof(s1) - 100, someString); // Is it right?
StringCchCopyW(s1 + 100, _countof(s1), someString); // Is it right?

// How about these?
StringCchCatW(s1, _countof(s1) - wcslen(s1), someString); // Is it right?
StringCchCatW(s1, _countof(s1), someString); // Is it right?

1 Ответ

1 голос
/ 19 августа 2010

Единственное, что не так со всеми функциями - вы забыли проверить возвращаемое значение. Даже функции String Safe могут давать сбой, и если они это сделают, они будут молча в вашем коде. Возвращаемые значения для строковых функций должны быть проверены всегда , иначе вы открылись для дыр в безопасности.

Кроме этого, очень трудно ответить на это определенным да или нет, потому что есть тонкие вопросы, которые нужно рассмотреть. Давайте возьмем их в порядке

StringCchCopyW(s1, _countof(s1), someString);

Это правильно и не имеет реальных проблем, кроме игнорируемого возвращаемого значения.

StringCchCopyW(s1 + 100, _countof(s1) - 100, someString); // Is it right?

Трудно ответить на этот вопрос. После этой операции s1+100 будет указывать на допустимый строковый объект, но это ничего не делает для s1. Это не открывает никаких дыр в безопасности, хотя.

StringCchCopyW(s1 + 100, _countof(s1), someString); // Is it right? 

Это очень неправильно. Вы указываете, что количество допустимых символов MAX_PATH, но передается буфер, в котором есть MAX_PATH-100 символов. Это может быть переполнение буфера, если someString достаточно долго.

StringCchCatW(s1, _countof(s1) - wcslen(s1), someString); // Is it right?

Это неправильно, но не так опасно. Вы сообщаете, что длина s1 на самом деле меньше, чем есть. Это не вызовет переполнения, но предотвратит добавление допустимых строк.

StringCchCatW(s1, _countof(s1), someString); // Is it right?

Это правильно при условии, что в s1 есть допустимая строка. Если в s1 нет правильной строки, это может привести к некорректному выполнению функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...