Библиотека заключается в том, что разработчик мог забыть правильно освободить стек, или злоумышленник может внедрить некоторый код, повредив стек DLL (например, путем перехвата API), который затем не проверяется вызывающей стороной. У меня нет примеров безопасности CVS, показывающих, что моя интуиция верна.
тоящее время я занимаюсь разработкой библиотеки C ++ для Windows, которая будет распространяться в виде DLL. Моя цель - максимизировать бинарную совместимость; более точно, функции в моей DLL должны быть пригодны для использования из кода, скомпилированного с несколькими версиями MSVC ++ и MinGW, без необходимости перекомпиляции DLL. Тем не менее, я не понимаю, какое соглашение о вызовах лучше,cdecl
или жеstdcall
.
Иногда я слышу такие утверждения, как «соглашение о вызовах C - это единственное гарантированное совпадение во всех компиляторах», что контрастирует с такими утверждениями, как «Есть некоторые различия в интерпретацииcdecl
особенно в том, как вернуть значенияMsgstr "Это не останавливает некоторых разработчиков библиотек (например,libsndfile) использовать соглашение о вызовах C в распространяемых ими DLL без каких-либо видимых проблем.
С другой стороны,stdcall
соглашение о вызовах, кажется, хорошо определено. Из того, что мне сказали, все компиляторы Windows в основном обязаны следовать ему, потому что это соглашение используется для Win32 и COM. Это основано на предположении, что компилятор Windows без поддержки Win32 / COM не будет очень полезным. Многие фрагменты кода, размещенные на форумах, объявляют функции какstdcall
но я не могу найти ни одного поста, который четко объясняетПочему.
Там слишком много противоречивой информации, и каждый поиск, который я выполняю, дает мне разные ответы, которые на самом деле не помогают мне выбирать между ними. Я ищу четкое, подробное, аргументированное объяснение того, почему я должен выбирать одно из другого (или почему два эквивалентны).
Обратите внимание, что этот вопрос относится не только к «классическим» функциям, но также и к вызовам виртуальных функций-членов, так как большая часть кода клиента будет взаимодействовать с моей DLL через «интерфейсы», то есть чисто виртуальные классы (следующие шаблоны описаны, например,Вот а такжетам).