Как добиться функциональности strncpy () с помощью функции strncpy_s ()?

В некоторых случаях мне действительно нужна функция strncpy () - например, у меня есть функция в предопределенном интерфейсе, которой передается адрес буфера и размер буфера:

HRESULT someFunction( char* buffer, size_t length );

и документально подтверждено, что я могу скопировать туда строку с завершающим нулем длиной не более length - если она точно имеет длину length Я не завершаю строку нулем, и вызывающая сторона знает, что строка заканчивается либо нулевым символом, либо длиной length в зависимости от того, что происходит раньше, и все это работает.

Конечно, я буду использовать для этого strncpy ()

HRESULT someFunction( char* buffer, size_t length )
{
    const char* toCopy = ...
    size_t actualLength = strlen( toCopy );
    if( actualLength > length ) {
        return E_UNEXPECTED; // doesn't fit, can't do anything reasonable 
    }
    strncpy( buffer, toCopy, length );
    return S_OK;
}

Теперь у меня есть этот код, и мне нужно перенести его с Visual C ++ 7 на Visual C ++ 9. Я компилирую его и вижу предупреждение о том, что strncpy () небезопасно , и я должен вместо этого использовать strncpy_s () .

strncpy_s () предназначен для того, чтобы всегда завершать буфер нулем, поэтому я не могу использовать его в качестве прямой замены в приведенном выше сценарии. Мне нужно будет вернуть E_UNEXPECTED для строк длиннее length - 1 (а не length , как раньше), или он просто запустит обработчик ошибок неверных параметров один раз строка имеет длину или больше, иначе программа будет работать с неопределенным поведением.

Решение, которое я применял до сих пор, - просто определить _CRT_SECURE_NO_WARNINGS и заставить компилятор отключиться.

есть ли способ использовать strncpy_s () как фактическую замену strncpy () ?

7
задан sharptooth 18 February 2011 в 12:47
поделиться