Пример #1
0
void CheckArgumentsOverflow()
{
    void *p;
    const size_t params[] = {SIZE_MAX, SIZE_MAX-16};

    for (unsigned i=0; i<Harness::array_length(params); i++) {
        p = Tmalloc(params[i]);
        ASSERT(!p, NULL);
        ASSERT_ERRNO(errno==ENOMEM, NULL);
        p = Trealloc(NULL, params[i]);
        ASSERT(!p, NULL);
        ASSERT_ERRNO(errno==ENOMEM, NULL);
        p = Tcalloc(1, params[i]);
        ASSERT(!p, NULL);
        ASSERT_ERRNO(errno==ENOMEM, NULL);
        p = Tcalloc(params[i], 1);
        ASSERT(!p, NULL);
        ASSERT_ERRNO(errno==ENOMEM, NULL);
    }
    const size_t max_alignment = size_t(1) << (sizeof(size_t)*CHAR_BIT - 1);
    if (Rposix_memalign) {
        int ret = Rposix_memalign(&p, max_alignment, ~max_alignment);
        ASSERT(ret == ENOMEM, NULL);
        for (unsigned i=0; i<Harness::array_length(params); i++) {
            ret = Rposix_memalign(&p, max_alignment, params[i]);
            ASSERT(ret == ENOMEM, NULL);
            ret = Rposix_memalign(&p, sizeof(void*), params[i]);
            ASSERT(ret == ENOMEM, NULL);
        }
    }
    if (Raligned_malloc) {
        p = Raligned_malloc(~max_alignment, max_alignment);
        ASSERT(!p, NULL);
        for (unsigned i=0; i<Harness::array_length(params); i++) {
            p = Raligned_malloc(params[i], max_alignment);
            ASSERT(!p, NULL);
            ASSERT_ERRNO(errno==ENOMEM, NULL);
            p = Raligned_malloc(params[i], sizeof(void*));
            ASSERT(!p, NULL);
            ASSERT_ERRNO(errno==ENOMEM, NULL);
        }
    }

    p = Tcalloc(SIZE_MAX/2-16, SIZE_MAX/2-16);
    ASSERT(!p, NULL);
    ASSERT_ERRNO(errno==ENOMEM, NULL);
    p = Tcalloc(SIZE_MAX/2, SIZE_MAX/2);
    ASSERT(!p, NULL);
    ASSERT_ERRNO(errno==ENOMEM, NULL);
}
int Tposix_memalign(void **memptr, size_t alignment, size_t size)
{
    int ret = Rposix_memalign(memptr, alignment, size);
    if (0 == ret)
        ASSERT(0==((uintptr_t)*memptr & (alignment-1)),
               "allocation result should be aligned");
    return ret;
}