Используя допустимую СТАТИЧЕСКУЮ функцию членства класса, который не может быть установлен

Для сохраненного proc возможно быть уязвимым для специальных типов Внедрения SQL через переполнение/усечение, видеть: Инжекция, Включенная Усечением Данных здесь:

http://msdn.microsoft.com/en-us/library/ms161953.aspx

6
задан Artyom 2 November 2009 в 18:40
поделиться

2 ответа

Оба компилятора прямо здесь; поведение для вашего случая не указано. ISO C ++ 14.7.1 [temp.inst] / 9:

Реализация не должна неявно создавать экземпляр шаблона функции, шаблона члена, невиртуальной функции-члена, класса-члена или статического члена данных шаблона класса, который не требует создания экземпляра. Не указано, создает ли реализация неявно виртуальную функцию-член шаблона класса , если виртуальная функция-член не создавалась бы в противном случае.

Причина этого довольно проста: виртуальная функция требует запись vtable, а при виртуальной отправке компилятору может быть сложно определить, действительно ли вызывается данная виртуальная функция или нет. Следовательно,

3
ответ дан 17 December 2019 в 07:06
поделиться

Удаление неиспользуемых функций произойдет при компоновке , а не при компиляции, в которой возникла ошибка. MSVC может не знать, кто из всех компилируемых единиц компиляции в конечном итоге вызовет этот метод. Это может' Не знаю, пока не завершится компиляция и пока не произойдет связывание. Естественно, разные компиляторы могут быть более умными в этом вопросе, но я подозреваю, что это может быть то, что происходит.

Я подозреваю, что ваши конкретные ошибки компилятора звучат так, как будто они вызваны тем, что вы только объявили вперед

template<typename C>
struct c_traits;

, вы не полностью указали класс. Вы пробовали что-нибудь простое, например:

template<typename C>
struct c_traits 
{
    // some default/dummy int type
};

Я подозреваю, что это, по крайней мере, остановит компилятор от жалоб.

РЕДАКТИРОВАТЬ

это вообще неправильно для класса шаблоны. Функции-члены класса шаблоны не должны быть скомпилированы (и любые ошибки в их тела не должны быть запущен), если они не созданы.

Шаблон создается в этом случае в форме:

 foo<short>

Компилятор будет рассматривать это как любой другой класс, методы которого имеют потенциал для внешней связи. Я не слышал какого-либо специального языкового правила, в котором говорилось бы, что внешняя связь не применяется к шаблонам ...?

1
ответ дан 17 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: