Visual Studio отлаживает итераторы - PullRequest
5 голосов
/ 24 мая 2011

Какова связь между _SECURE_SCL и _HAS_ITERATOR_DEBUGGING .Можно ли включить / выключить проверку диапазона и сохранить двоичную совместимость?

Есть ли разница между версиями 2008 и 2010 годов?

1 Ответ

7 голосов
/ 24 мая 2011

Стефан Лававей предоставил некоторые подробности об этом _SECURE_SCL и _HAS_ITERATOR_DEBUGGING:

С http://blogs.msdn.com/b/vcblog/archive/2007/08/10/the-future-of-the-c-language.aspx

Отладка итератора, включенная _HAS_ITERATOR_DEBUGGING, выполняет мощную проверку правильности.Проверка итератора, включенная _SECURE_SCL, выполняет минимальные проверки, которые служат последней линией защиты.Например, _SECURE_SCL завершит программу, которая запускает переполнение кучи с помощью итератора вектора.

Все это объясняется документацией MSDN.История за этим интересна.Функциональность _HAS_ITERATOR_DEBUGGING была предоставлена ​​Dinkumware, компанией, которая лицензирует свою наиболее торжественную реализацию Стандартной библиотеки для включения в Visual Studio.Microsoft добавила функциональность _SECURE_SCL, чтобы повысить безопасность программ, работающих в Windows.Для выполнения своих проверок и _HAS_ITERATOR_DEBUGGING, и _SECURE_SCL заставляют итераторы содержать дополнительные элементы данных, такие как указатели на их родительские контейнеры._HAS_ITERATOR_DEBUGGING, поскольку он включен по умолчанию в режиме отладки (и недоступен в режиме выпуска), также создает односвязные списки, которые позволяют контейнерам ссылаться на все свои итераторы.Это дорого с точки зрения производительности, но производительность не критична в режиме отладки, и это обеспечивает отличные проверки.

_SECURE_SCL, поскольку он включен по умолчанию в режиме выпуска, стремится наложить минимальные потери производительности.Поэтому, когда он включен, хотя итераторы имеют указатели на свои контейнеры, контейнеры не имеют указателей на свои итераторы.(Обновление «списков итераторов» слишком трудоемко для режима выпуска.)

Обратите внимание, что начиная с VS 2010, _SECURE_SCL больше не включается по умолчанию в режиме выпуска (приведенная выше выдержка из2007).

Как описано в этом отчете об ошибке (http://connect.microsoft.com/VisualStudio/feedback/details/334315/has-iterator-debugging-0-causes-crash), и _SECURE_SCL, и _HAS_ITERATOR_DEBUGGING влияют на ABI:

_SECURE_SCL и _HAS_ITERATOR_DEBUGGING значительно изменяют поведениеи представления контейнеров и итераторов STL. VC9 (Visual Studio 2008) сделал представления контейнеров и итераторов STL еще более зависимыми от _SECURE_SCL и _HAS_ITERATOR_DEBUGGING (это было сделано для исправления ошибки соответствия).

Поскольку эти макросыЧтобы изменить представления объектов STL, вы должны соблюдать определенные правила при изменении этих макросов по умолчанию. Я описал правила здесь: http://blogs.msdn.com/vcblog/archive/2007/08/10/the-future-of-the-c-language.aspx#4617984 Подводя итог, макросы должны быть согласованы в каждом двоичном файле (EXE или DLL), икроме того, двоичные файлы, которые передают объекты STL друг другу, должны иметь согласованностьНастройки макросов.В вашем примере EXE и DLL передают вектор между собой, поэтому EXE и DLL должны иметь одинаковые настройки _SECURE_SCL и _HAS_ITERATOR_DEBUGGING.

Эти правила применяются к VC8, VC9 и всем последующим версиям.Ваш код работал с VC8 (Visual Studio 2005), но потерпит неудачу, если бы он делал более сложные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...