Всякий раз, когда вы перемещаете данные между буферами не постоянного размера, вы должны (задыхаться! Omg!) На самом деле подумать о том, подходит ли оно.Использование функций (например, специфичных для MS strcpy_s
или BSD strlcpy
), которые якобы «безопасны», защитит вас от некоторых явных условий переполнения буфера, но не защитит вас от ошибокэто результат усечения строки.Это также не защитит вас от целочисленных переполнений при вычислении буферов необходимого размера.
Если вы не разбираетесь в строках C, я бы рекомендовал забыть о специальных функциях и комментировать каждые строка вашего кода, которая будет выполнять запись переменной длины / позиции с обоснованием того, как вы знаете, в данный момент в программе, что длина / смещение, которое вы собираетесь использовать, находится в пределах размера буфера,Сделайте это для строк, где вы также выполняете арифметику для размеров / смещений - запишите, как вы знаете, что арифметика не будет переполнена, и добавьте тесты на переполнение, если вы обнаружите, что вы не знаете.оберните всю вашу обработку строк в строковый объект, который хранит длину буфера вместе со строкой и автоматически перераспределяет, когда строка должна быть увеличена, и затем используйте const char *
только для чтения для доступа к строкам, когда вам нужно передатьих к системным функциям или другим библиотекам.Это принесет в жертву большую часть производительности, которую вы ожидаете от C, но поможет вам избежать ошибок.Только не доводите это до крайности.Нет необходимости дублировать такие вещи, как strchr
, strstr
и т. Д. В вашей обёртке строки.Просто предоставьте методы для дублирования строковых объектов, их объединения и усечения, а затем с помощью существующих библиотечных функций, работающих с const char *
, вы можете делать практически все, что захотите.