Допустим, у меня есть устаревший код, который был написан с использованием небезопасных вызовов функций C STL, таких как strcpy
. Мы все знаем, что strcpy
небезопасен, потому что делает программу уязвимой для проблем с переполнением буфера. Допустим, я хочу заменить все вызовы strcpy
вызовами strncpy
. Техника замены всех вызовов strcpy(dest, src)
включает вызов strncpy
с параметрами (dest, src, length of dest - 1)
и последующее завершение dest
с \0
. Я знаю, что проблема в том, что мы не всегда знаем длину dest
, потому что это может быть указатель на память, выделенную в куче.
Предположим, я могу вычислить длину dest
на каждом из этих сайтов вызовов. Я мог бы заменить все вызовы strcpy
вызовами strncpy
, что гарантирует, что моя программа невосприимчива к атакам переполнения буфера (по крайней мере, из-за неправильного использования strcpy
). Однако этот подход может незаметно усекать данные и нежелательным образом изменять поведение программы. Является ли это лучшим подходом, чем обнаружение усечения и прерывание программы? Или лучше разрешить усечение, но также зарегистрировать его?
Я спрашиваю с точки зрения того, кто заинтересован в разработке автоматизированного метода исправления устаревшего кода. У кого-нибудь есть мысли о том, как лучше всего подойти к этому вопросу?
ArrayIndexOutOfBoundsException
в Java и регистрации исключения где-то. Прерывание программы кажется немного чрезмерным. Мне просто интересно, что другие люди думают о подходе к логированию. - person RouteMapper   schedule 14.11.2013strcpy
без проверки контекста, в котором оно происходит), вы не должны усекать. - person Steve Jessop   schedule 14.11.2013strcpy
, которая (а) является правильной реализацией в соответствии со стандартом, поэтому, кроме производительности, она не влияет на любую программу, которая правильно вызываетstrcpy
( хотя для того, чтобы это было правдой, вы не должны не просто вызыватьstrncpy
из-за поведения нулевого заполненияstrncpy
) (b) предотвращает переполнение буфера, (c) заменяет переполнение буфера UB каким-либо другим поведением, которое (будь то прерывание или запись в журнал) помогает диагностировать проблему. - person Steve Jessop   schedule 14.11.2013