Каковы некоторые недостатки использования строк в стиле C? - PullRequest
8 голосов
/ 23 ноября 2008

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

РЕДАКТИРОВАТЬ: Вот пример, близкий к тому, над чем я работаю:

char buffer[1024];
char * line = NULL;
while ((line = fgets(fp)) != NULL) { // this won't compile, but that's not the issue
    // parse one line of command output here.
}

Этот код получает данные из указателя FILE, который был создан с помощью команды popen("df"). Я пытаюсь запустить команды Linux и проанализировать их вывод, чтобы получить информацию об операционной системе. Есть ли что-то неправильное (или опасное) при установке буфера на произвольный размер таким образом?

Ответы [ 16 ]

2 голосов
/ 23 ноября 2008

Я думаю, что можно использовать их, люди используют их годами. Но я бы предпочел использовать std :: string, если это возможно, потому что 1) вам не нужно каждый раз быть настолько осторожным и думать о проблемах своего домена, вместо того, чтобы думать, что вам нужно каждый раз добавлять другой параметр ... управление памятью и все такое ... это просто безопаснее кодировать на более высоком уровне ... 2) есть, вероятно, некоторые другие небольшие проблемы, которые не имеют большого значения, но все же ... как уже упоминавшиеся люди ... кодирование, юникод ... все эти "связанные" вещи, которые люди создают std :: string мысли о ... :)

Обновление

Я работал над проектом в течение полугода. Каким-то образом я был достаточно глуп, чтобы никогда не компилировать в режиме релиза перед доставкой .... :) Хорошо ... к счастью, была только одна ошибка, которую я нашел после 3 часов. Это было очень простое переполнение буфера строки.

0 голосов
/ 24 ноября 2008

Еще один вопрос: кто будет поддерживать ваш код? Как насчет двух лет? Будет ли этот человек чувствовать себя так же комфортно с C-stlye струнами, как вы? По мере того, как STL становится более зрелым, кажется, что людям будет все более комфортно работать со строками STL, чем со строками в стиле C.

0 голосов
/ 23 ноября 2008

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

Раньше говорилось, что каноническим определением языка высокого уровня было «что-нибудь с лучшей обработкой строк, чем C».

0 голосов
/ 23 ноября 2008

На этот вопрос на самом деле нет ответа.
Если вы пишете на C, какие варианты у вас есть?
Если вы пишете на C ++, почему вы спрашиваете? В чем причина не использовать примитивы C ++?
Единственная причина, по которой я могу думать, это: связывать код на C и C ++ и иметь char * где-нибудь в интерфейсах. Иногда просто просто использовать char * вместо того, чтобы все время выполнять преобразование назад и вперед (особенно если это действительно «хороший» код C ++, который имеет 3 различных типа строковых объектов C ++).

0 голосов
/ 23 ноября 2008

Имхо, самая сложная точка cstrings - это управление памятью, потому что вам нужно быть осторожным, если вам нужно передать копию cstring или если вы можете передать литерал в функцию, т.е. освободит ли переданная строка функцию или будет хранить ссылку дольше, чем для вызова функции. То же самое относится к возвращаемым значениям cstring.

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

0 голосов
/ 23 ноября 2008

c строки имеют возможность неправильного использования из-за того, что нужно сканировать строку, чтобы определить, где она заканчивается.

strlen - чтобы найти длину, отсканируйте строку, пока не нажмете NUL, или не получите доступ к защищенной памяти

strcat - должен сканировать, чтобы найти NUL, чтобы определить, где начать объединение. В строке c нет сведений о том, будет ли переполнение буфера или нет.

c строки опасны, но обычно быстрее, чем строковые объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...