#debugging #visual-c #clr
#отладка #visual-c #clr
Вопрос:
Мы работаем с библиотекой DLL, которая годами компилировалась в VC как родная. Эта DLL использует fwscanf_s без указания размера считываемых параметров (я уже знаю, что это неправильно). DLL была скомпилирована с /RTC1 в режиме отладки и без него в режиме выпуска: оба режима работали правильно.
Теперь мы превратили эту библиотеку DLL в управляемую (скомпилированную с помощью /CLR) и удалили флаг /RTC1 из отладочной компиляции. В результате fwscanf_s больше не работает в режиме отладки (он работает в режиме выпуска, также без /RTC1).
Мы исправили это, добавив размер считываемых параметров, и теперь это работает либо в режиме отладки, либо в режиме выпуска, но мы все еще удивляемся этому странному поведению fwscanf_s.
У кого-нибудь есть идея?
Большое вам спасибо!!!
Комментарии:
1. По-видимому, у вас есть что-то вроде
fwscanf_s(f, "%s", p)
. Затем функция считывает случайный мусор, который случайно попадает в стек вышеp
, и интерпретирует его как размер буфера, на которыйp
указывает. Если это случайное значение окажется достаточно большим, функция, по-видимому, будет работать (но может привести к переполнению буфера); если оно окажется меньше входного, функция, я думаю, усечет указанный ввод. Различные настройки компилятора просто меняют шаблоны использования стека, что влияет на то, какие случайные байты, вероятно, будут находиться в стеке рядомp
.2. Спасибо, Игорь, это тоже была наша первая мысль… Но мы считаем, что компилятор должен выдавать предупреждения или исключения (во время выполнения) по этому поводу, но у нас нет ни предупреждений, ни исключений… Это странно.
3. «Но мы считаем, что компилятор должен выдавать предупреждения или исключения (во время выполнения)» И что именно заставляет вас так думать? Как вы ожидаете, что функция определит, что четыре байта в стеке не являются целым числом, намеренно помещенным туда вызывающим, а просто случайным мусором, оставленным какой-либо предыдущей активностью стека?
4. Вы совершенно правы. Я думаю, что кофе нас запутал 🙂 Спасибо, Игорь!