странное поведение fwscanf_s в управляемых (и отладочных) компиляциях

#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. Вы совершенно правы. Я думаю, что кофе нас запутал 🙂 Спасибо, Игорь!