|
December 22nd, 2023
steinkrauz | 05:38 pm - Си -- говно, а MSVC -- дважды. Как вы думаете, на что я сегодня убил полдня? Правильно, на отладку сишного кода. Полдня это потому что код сидит внутри библиотеки, которая дёргается в рантайм-контексте. Поэтому никаких тестов, скомпилили библиотечку, засунули в систему, подняли клиента, дёрнули процесс, система упала, посмотрели логи, вернулись к началу.
ну ладно, я человек упорот упорный, докопался. Так как в Си, как известно, строк нет, у меня был статический массивчик, куда клалось имя текущего верхнего элемента с тем, что если в кишках его найдётся ошибка, добавить это имя в лог. Потыкав пальцем в небо, я дал этому массиву размер в 128 байт, потому как для большинства имён это было с хорошим запасом. Но кому-то понадобилось назвать элемент «Установка прокладкоустойчивой канализационной арматуры с автоматическим фекальным запором "Сфинктер-ВЖ-ЕБ" №2». И, бинго, оно оказалось 129 символов, почему на моменте копирования из контейнера в переменную всё и рушилось.
Казалось бы, причём тут MSVC, когда сам рак? Чукча, конечно, тупой, но соломку подстелил: копировалось оно безопасной функцией strcpy_s. В MSDN пикселями по экрану четко написано: возвращаем код ошибки и ставим dest[0]=0, если dest слишком маленький. То есть по идее в случае слишком длинного имени я максимум получаю неполное сообщение о проблеме в логе проверок, и то, если оно таки будет. Собственно почему так долго и искал: всё смотрел глубже по коду, а strcpy_s она ж безопасная, там все проверки есть. Авотхуй, при копировании большего буфера в меньший трапнулась, как таиландский шимейл.
|
Reply
|
|
|
LJ.Rossia.org |