История изменений
Исправление 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() это обеспечивает.