LINUX.ORG.RU

История изменений

Исправление hobbit, (текущая версия) :

Ну или (на совсем крайний случай) замутить свой тип данных, состоящий из длины «строки» и собственно массива, содержащего эту самую «строку».

…И некоторого количества аналогов функций типа strcpy, strcat и др., которые проверяют размер и при необходимости перераспределяют память, видимо. Для эффективности ещё, наверное, имеет смысл память выделять с запасом и вести два счётчика: один - текущая длина строки, другой - размер выделенной памяти, чтобы не делать перераспределение на каждый чих.

Проще настроить splint и просто не болеть болезнью «грязных рук» при работе с памятью.

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

Короче, я понял, в общем случае решение — таки GString. Спасибо.

А, и ещё.

Я абсолютно согласен с тем, что в utf’нутой системе перекодировкой заниматься ненужно. Если всё в UTF, то тут кодировать и нечего и незачем.

В UTF (особенно если это UTF8) возникает другая проблема — позиционирование по символам, а не по байтам. Есть функция «вытащить из строки символы с 3 по 5», если эти символы в общем случае разной длины, например что-то русско-английское? Вот QString::mid() это обеспечивает.

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

Исходная версия hobbit, :

Ну или (на совсем крайний случай) замутить свой тип данных, состоящий из длины «строки» и собственно массива, содержащего эту самую «строку».

…И некоторого количества аналогов функций типа strcpy, strcat и др., которые проверяют размер и при необходимости перераспределяют память, видимо. Для эффективности ещё, наверное, имеет смысл память выделять с запасом и вести два счётчика: один - текущая длина строки, другой - размер выделенной памяти, чтобы не делать перераспределение на каждый чих.

Проще настроить splint и просто не болеть болезнью «грязных рук» при работе с памятью.

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

Короче, я понял, в общем случае решение — таки GString. Спасибо.

А, и ещё.

Я абсолютно согласен с тем, что в utf’нутой системе перекодировкой заниматься ненужно. Если всё в UTF, то тут кодировать и нечего и незачем.

В UTF (особенно если это UTF8) возникает другая проблема — позиционирование по символам, а не по байтам. Есть функция «вытащить из строки символы с 3 по 5», если эти символы в общем случае разной длины, например что-то русско-английское? Вот QString::mid() это обеспечивает.