Почему strcpy () и strcat () плохо работают во встроенном домене - PullRequest
3 голосов
/ 03 ноября 2011

Здесь я хочу узнать о strcpy() and strcat() недостатках

Я хочу знать об этих функциях: опасная зона во встроенном домене / окружении.

кто-то сказал мне, что мы никогда не используем strcpy,strcat and strlen функцииво встроенном домене, потому что он заканчивается нулем, а иногда мы работаем с зашифрованными данными, а нулевой символ приходит, поэтому мы не можем получить реальный результат, потому что эти функции останавливаются на нулевом символе.

Так что я хочу знать все вещи и другую альтернативуэти функции.как мы можем использовать другие альтернативные функции

Ответы [ 7 ]

13 голосов
/ 03 ноября 2011

Функция str * работает со строками. Если вы имеете дело со строками, их можно использовать при условии, что вы используете их правильно - легко создать переполнение буфера , если вы используете их неправильно.

Если вы имеете дело с двоичными данными, которые, как вам кажется, не подходят, функции обработки строк (в конце концов, они предназначены для строк, а не для двоичных данных). Используйте функции mem * для работы с двоичными данными.

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

3 голосов
/ 03 ноября 2011

Ну, эти функции действительно копируют строки с нулевым символом в конце, и не только во встроенном домене.В зависимости от ваших потребностей вы можете использовать вместо mem* функции.

2 голосов
/ 04 ноября 2011

Как уже отвечали другие, они отлично работают для строк. Зашифрованные данные не могут рассматриваться как строки.

Тем не менее, есть аспект использования любой C библиотечной функции во встроенных системах, особенно во встроенных системах реального времени с высокой степенью целостности, таких как автомобильная / медицинская / авионика и т. Д. В таких проектах кодирование будет использоваться стандарт, такой как MISRA-C.

Подавляющее большинство библиотек C, вероятно, несовместимы с вашим стандартом кодирования. И даже если у вас есть возможность (по крайней мере, в MISRA-C) вносить отклонения, вам все равно придется проверять всю библиотеку. Например, вам нужно будет проверить весь string.h только потому, что вы использовали strlen (). Обычной практикой в ​​таких системах является написание всех функций самостоятельно, особенно простых, таких как strlen (), которые вы можете написать самостоятельно за минуту.

Но большинство встраиваемых систем не предъявляют столь высоких требований к качеству и безопасности, и функции библиотеки предпочтительнее. В частности, memcpy () и аналогичные функции поиска / сортировки / перемещения, которые, вероятно, будут сильно оптимизированы компилятором.

1 голос
/ 03 ноября 2011

Эта проблема относится к описываемой вами системе, а не к встроенным системам как таковым.В любом случае строковые функции просто не подходят для приложения, которое вы описываете.Я думаю, вам просто следовало сказать, что вы не можете использовать строковые функции для зашифрованных данных в вашем конкретном приложении.Это не проблема встроенных систем или даже строковой библиотеки.Все дело в природе ваших зашифрованных строк - они больше не являются строками C после шифрования, поэтому любая операция с библиотекой строк больше не будет действительной - она ​​становится просто данными, и вы несете ответственность за сохранение любых необходимых метаданных, касающихсядлина и т. д. Вы можете использовать строки стиля Pascal, например, для этого (с подходящей сопровождающей библиотекой).

Теперь в общем случае библиотека строк C и строки C сами по себе представляют ряд проблем для всех систем,не просто встроенный.См. эту статью Джоэла Спольски , чтобы понять, почему следует соблюдать осторожность при использовании функций строк C, особенно strcat ().

1 голос
/ 03 ноября 2011

Если вы беспокоитесь о перезаписи буферов (что на самом деле должно быть всем), используйте вместо этого strncpy или strncat.Я не вижу проблем с strlen.

0 голосов
/ 03 января 2012

Как уже говорили, функции str * предназначены для строк, а не для двоичных данных.

Тем не менее, я предлагаю, чтобы когда вы стали использовать строки, вы должны рассмотреть такие функции, как strlcpy () вместо strcpy () и strlcat () вместо strcat ().

Они не являются стандартными функциями, но вы сможете найти их копии достаточно легко (или просто напишите свои). Они принимают размер буфера назначения в качестве дополнительного параметра для своих стандартных двоюродных братьев и предназначены для предотвращения переполнения буфера.

Вероятно, это навязывание необходимости обойти размер блока указателя, где бы вы его не использовали, но я боюсь, что это то, о чем говорит программирование на Си.

По крайней мере, пока мы не получим более умные указатели.

0 голосов
/ 03 ноября 2011

Причина в том, что вы сказали:

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

А для альтернатив я рекомендую strn* серии вроде strncpy, strnlen. n здесь означает максимально возможную длину строки.

Возможно, вы захотите найти ссылку на библиотеку стандарта C и узнать некоторые подробности об этих strn* функциях.

...