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?
答案 0 :(得分:1)
所有功能的一个问题是你忽略了检查返回值。即使字符串安全功能也可能失败,如果他们这样做,他们将默默地在您的代码中。字符串函数的返回值应该始终检查,或者您已经打开安全漏洞。
除此之外,很难用肯定的肯定或否定来解决这个问题,因为有一些微妙的问题需要考虑。让我们按顺序接受它们
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中没有有效的字符串,则可能导致函数执行错误。