Microsoft是标准::reverse_copy的安全替代品?



我有以下代码:

Integer::Integer(const byte *encodedInteger, size_t byteCount, Signedness s, ByteOrder o)
{
    if(o == LITTLE_ENDIAN_ORDER)
    {
        SecByteBlock block(byteCount);
        std::reverse_copy(encodedInteger, encodedInteger+byteCount, block.begin());
        Decode(block.begin(), block.size(), s);
        return;
    }
    ...
}

我在std::reverse_copy上收到 C4996 警告:

1>c:Program Files...VCincludealgorithm(2184): warning C4996: 'std::_Reverse_copy': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'
1>          c:...VCincludealgorithm(2168) : see declaration of 'std::_Reverse_copy'
1>          integer.cpp(2898) : see reference to function template instantiation '_OutIt std::reverse_copy<const byte*,unsigned char*>(_BidIt,_BidIt,_OutIt)' being compiled
1>          with
1>          [
1>              _OutIt=unsigned char *,
1>              _BidIt=const byte *
1>          ]

我很乐意提供目标缓冲区大小或最后一个目标元素,以符合Microsoft平台上的最佳实践。

byteCount是一个参数(而不是编译时常量),所以我不能使用目标缓冲区大小调用重载(下面的模板参数count):

std::reverse_copy<byte*, byte*, count>(...);

我也天真地尝试添加目标缓冲区大小和最后一个元素,但它们导致编译错误"期望 3 个参数 - 提供 4 个"

std::reverse_copy(encodedInteger, encodedInteger+byteCount, block.begin(), block.begin()+block.size());

Microsoft 对 std::reverse_copy 的安全替代品是什么,允许我指定目标缓冲区大小?


以下是Microsoft从<algorithm>提供的重载:

template<class _BidIt,
    class _OutIt> inline
_SCL_INSECURE_DEPRECATE
    _OutIt _Reverse_copy(_BidIt _First, _BidIt _Last,
        _OutIt _Dest,
        _STD tr1::false_type)
    {   // copy reversing elements in [_First, _Last), unchecked dest
    return (_Reverse_copy(_First, _Last,
        _Dest, _Iter_cat(_First), _Iter_cat(_Dest)));
    }
template<class _BidIt,
    class _OutIt> inline
    _OutIt reverse_copy(_BidIt _First, _BidIt _Last,
        _OutIt _Dest)
    {   // copy reversing elements in [_First, _Last)
    _DEBUG_RANGE(_First, _Last);
    _DEBUG_POINTER(_Dest);
    return (_Reverse_copy(_Unchecked(_First), _Unchecked(_Last),
        _Dest, _Is_checked(_Dest)));
    }
template<class _BidIt,
    class _OutTy,
    size_t _OutSize> inline
    _OutTy *reverse_copy(_BidIt _First, _BidIt _Last,
        _OutTy (&_Dest)[_OutSize])
    {   // copy reversing elements in [_First, _Last), array dest
    return (_Unchecked(
        _STD reverse_copy(_First, _Last,
            _Array_iterator<_OutTy, _OutSize>(_Dest))));
    }

问题不在于函数。编译器只是(有用地)通知您代码不安全,因为无法在调试模式下检查指针,因此任何溢出都会导致未定义的行为。

VC++ 专门为此目的提供了一个称为 stdext::make_checked_array_iterator 的函数。像这样使用它:

std::reverse_copy(encodedInteger, encodedInteger+byteCount, 
     stdext::make_checked_array_iterator(block.begin(), block.size()));

最新更新