Предположим, у меня есть код устаревшего кода, который был написан с использованием небезопасных вызовов функций C STL, таких как strcpy
. Мы все знаем, что strcpy
небезопасно, потому что он оставляет программу уязвимой для проблем с переполнением буфера. Предположим, я хочу заменить все звонки на strcpy
с звонками на strncpy
. Метод замены всех вызовов на strcpy(dest, src)
будет включать в себя вызов strncpy
с параметрами (dest, src, length of dest - 1)
, а затем завершение dest
с \0
. Я знаю, что проблема заключается в том, что мы не всегда знаем длину dest
, потому что это может быть указатель на память, выделенную в куче.Замена strcpy на strncpy
Предположим, что я могу вычислить длину dest
на каждом из этих сайтов вызова. Я мог бы заменить все вызовы на strcpy
с помощью вызовов strncpy
, которые гарантируют, что моя программа невосприимчива к атакам переполнения буфера (по крайней мере, от неправильного использования strcpy
). Тем не менее, этот подход может незаметно обрезать данные и изменять поведение программы нежелательным образом. Это лучший подход, чем обнаружение усечения и прерывание программы? Или лучше разрешить усечение, но также записать его?
Я спрашиваю с точки зрения того, кто заинтересован в разработке автоматизированного метода для исправления устаревшего кода. У кого-нибудь есть мысли о том, как наилучшим образом подойти к этой проблеме?
strncpy() намного хуже. Посмотрите на свою реализацию CRT для альтернатив. Или просто напишите свое. Это не простая подстановка, вам нужно знать размер буфера, и это может потребовать изменения сигнатур функций, поэтому размер буфера передается в качестве аргумента. –
Я бы не стал изменять исходный код для реализации этих изменений. Я бы модифицировал программу на промежуточном языке, который позволяет получить доступ к этим размерам буфера. Я бы хотел, чтобы возвращаемый тип этих вызовов оставался прежним, поэтому альтернативы CRT не хватит. – RouteMapper
Я не могу себе представить, что тихое усечение данных всегда хорошо. Я согласен с @HansPassant, что реализация вашей собственной strncpy может быть правильным путем. Затем вы можете поместить (как минимум) ведение журнала, когда усечение происходит прямо внутри этой функции. – Jud