(file) Return to intsafe.h CVS log (file) (dir) Up to [OMI] / omi / pal

File: [OMI] / omi / pal / intsafe.h (download)
Revision: 1.1, Fri Sep 25 19:24:20 2015 UTC (8 years, 7 months ago) by krisbash
Branch: MAIN
CVS Tags: OMI_1_0_8_2, OMI_1_0_8_1, HEAD
OMI 1.0.8-2 commit

#ifndef _intsafe_h
#define _intsafe_h

#include "palcommon.h"

PAL_BEGIN_EXTERNC

#define INTSAFE_E_ARITHMETIC_OVERFLOW   ((HRESULT)0x80070216L)  // 0x216 = 534 = ERROR_ARITHMETIC_OVERFLOW
#define _SIZE_T_ERROR   0xffffffff

#ifndef SIZE_MAX
# ifdef PAL_64BIT
#  define SIZE_MAX (18446744073709551615UL)
# else
#  define SIZE_MAX (4294967295U)
# endif
#endif

PAL_INLINE HRESULT
SizeTAdd(
    _In_ size_t Augend,
    _In_ size_t Addend,
    _Out_ _Deref_out_range_(==, Augend + Addend) size_t* pResult)
{
    HRESULT hr;

    if ((Augend + Addend) >= Augend)
    {
        *pResult = (Augend + Addend);
        hr = S_OK;
    }
    else
    {
        *pResult = _SIZE_T_ERROR;
        hr = INTSAFE_E_ARITHMETIC_OVERFLOW;
    }
    return hr;
}

PAL_INLINE HRESULT
SizeTMult(
    _In_ size_t Multiplicand,
    _In_ size_t Multiplier,
    _Out_ _Deref_out_range_(==, Multiplicand * Multiplier) size_t* pResult)
{
    HRESULT hr;
    if (Multiplier == 0 || Multiplicand == 0 || Multiplicand <= SIZE_MAX / Multiplier)
    {
        *pResult = Multiplicand * Multiplier;
        hr = S_OK;
    }
    else
    {
        *pResult = _SIZE_T_ERROR;
        hr = INTSAFE_E_ARITHMETIC_OVERFLOW;
    }
    return  hr;
}

PAL_END_EXTERNC

#endif /* _intsafe_h */

ViewCVS 0.9.2