zHz00 Untitled

среда, 06 ноября 2024
02:30 Это не Питон
(но в Питоне тоже можно обосраться похожим образом)

В коде нашёл спящую ошибку. Есть строка типа...

char *str=new char[len];

В эту строку раз за разом копируется разный текст через strcpy

strcpy_s(str,len,src);//src каждый раз разный

Потом эта строка отправляется куда-то на обработку, а после обработки в неё копируется следующая строка. Это происходит не в цикле, а методом китайского кода, т.е. строка за строкой.

Оставим в стороне вопрос о том, почему сразу не отправлять src. Тому есть причина.

Несколько копирований проходит успешно, но во время очередного я получаю access violation. Откуда он там может быть? Я тихо копирую в свою область раз за разом. Может быть, не хватает места?

Но путём отладки я обнаруживаю, что ошибка происходит при копировании в ПЕРВЫЙ байт. А когда это возможно?

Когда пытаешься копировать в const-область или типа того. Но у меня же не константная область? Точнее, не была константная ещё три строчки назад. Хммм...

Поднимаю глаза на предыдущие строки. А там примерно следующее:

if(very_rare_option)
{
str="Very rare string";
}

Много лет редкий флаг не выставлялся, поэтому строчка не выполнялась. Но я выставил этот флаг. В результате произошло присваивание. Но в Си++ строки таким образом не присваиваются. Тип правого выражения это const char *, а тип левого -- char *. Я присвоил константный указатель на строку и успешно с ним поработал. Но при попытке записи я стал записывать не по старому адресу, на который была выделена память, а по адресу &"Very rare string", который теперь содержался в str. А там запрещённая для записи область...

Естественно, пришлось переписать:

strcpy_s(str,len,"Very rare string");

И проблема исчезла.

@темы: Программирование, Фейлы, Говнокод

URL

06.11.2024 в 03:47

06.11.2024 в 03:47
в питоне в принципе все строки const. когда хочется даже один символ поменять - меняется вся строка через копирование.
URL

06.11.2024 в 06:04

06.11.2024 в 06:04
Какой ужас, почему люди до сих пор пишут на этих ужасных языках, где по любой мелочи и невнимательности вылезает в лучшем случае сегфолт, а в худшем уб или уязвимость
URL

06.11.2024 в 10:56

06.11.2024 в 10:56
Каждый раз как читаю что-то подобное, радуюсь что не пишу на си или питоне)

Правда, у меня есть другие опасности. Например, можно написать if variable_name = 123 вместо if variable_name == 123 и отхватить неожиданное поведение =)
URL

07.11.2024 в 17:48

07.11.2024 в 17:48
> Тип правого выражения это const char *, а тип левого -- char *. Я присвоил константный указатель на строку и успешно с ним поработал.

TIL, что в Си это совершенно валидно, даже предупреждения не будет. В кои-то веки рад, что пишу на плюсах :D

-- Minoru
URL

08.11.2024 в 01:22

08.11.2024 в 01:22
>>Какой ужас, почему люди до сих пор пишут на этих ужасных языках, где по любой мелочи и невнимательности вылезает в лучшем случае сегфолт, а в худшем уб или уязвимость

Успешность языка -- вещь эзотерическая. Он должен быть не только объективно хорош и универсален, он должен ещё иметь сообщество. Поэтому люди продолжают писать на голом Си, на плюсах, на пыхе. А пёрл загнивает. Распрекрасный хаскель является не практическим, а академическим языком.

Xersareeth, да, это известная проблема в си/си++ тоже. Типовое решение в том, чтобы писать 123 == вариейбл_нейм. Но его неудобно читать. Второе типовое решение -- использовать статический анализатор кода. Это одна из простейших ошибок, причём довольно распространённх. Её легко совершить. И её легко обнаружить.

Minoru, В Си++ тоже предупреждения не было! Может, оно в компиляторе отключено. Проверю.
URL