Как Microsoft SAL может предотвратить ошибку «один на один»

Вот пример, приведенный на MSDN (http://msdn.microsoft.com/en-us/library/hh916383.aspx), которая пыталась объяснить аннотацию SAL, могла помочь найти распространенную ошибочную ошибку.

wchar_t * wmemcpy(
_Out_writes_all_(count) wchar_t *dest,
_In_reads_(count) const wchar_t *src,
size_t count)
{
size_t i;
for (i = 0; i <= count; i++) { // BUG: off-by-one error
dest[i] = src[i];
}
return dest;
}

Я не совсем понимаю этот пример. В этом примере похоже, что сигнатура функции содержит параметр с именем countтак что мы можем использовать In_reads_(count) чтобы убедиться, что пространство памяти, которое src указывает на, по крайней мере, такое количество байтов.

У меня вопрос, что если есть функция с подписью, как это

memcpy_example(wchar_t* dest, wchar_t* src)

В этом случае подпись не содержит никакой информации о размерах. Могу ли я использовать SAL, чтобы сообщить отладчику, что dest должен быть того же размера или на 1 байт больше, чем src?

1

Решение

Правильная аннотация будет:

memcpy_example(
_Out_writes_z_(_String_length_(src) + 1) wchar_t *dest,
_In_z_ const wchar_t *src)

Однако анализ в этом случае гораздо менее точен, поскольку анализатор не знает фактическую длину строки в большинстве случаев (протестировано с VS 2013):

void test_sal()
{
wchar_t out[10];
auto in1 = L"12345678901234";
auto in2 = _wcsdup(L"12345678901234");

memcpy_example(out, in1); // SAL warning
memcpy_example(out, in2); // No warning!
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]