c
#include <limits.h>

size_t safe_mul(size_t a, size_t b, int* overflow) {
    size_t result;
    *overflow = __builtin_mul_overflow(a, b, &result);
    return result;
}

size_t safe_add(size_t a, size_t b, int* overflow) {
    size_t result;
    *overflow = __builtin_add_overflow(a, b, &result);
    return result;
}

int overflow1 = 0, overflow2 = 0, overflow3 = 0;
size_t offset1 = safe_mul(nXDst, dstBytesPerPixel, &overflow1);
size_t offset2 = safe_mul(nYDst, nDstStep, &overflow2);
size_t total_offset = safe_add(offset1, offset2, &overflow3);

if (overflow1 || overflow2 || overflow3) {
    // Handle overflow error
    return NULL;
}

const BYTE* pDstStart = &pDstData[total_offset];
