summaryrefslogblamecommitdiffstats
path: root/spec/c/req/posix-memalign.yml
blob: 7698f9814544982a5493c430df7ab54ace75ea92 (plain) (tree)












































































































































































































































































































                                                                               
SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
copyrights:
- Copyright (C) 2021 embedded brains GmbH (http://www.embedded-brains.de)
enabled-by: true
functional-type: action
links:
- role: interface-function
  uid: ../if/posix-memalign
post-conditions:
- name: Status
  states:
  - name: Zero
    test-code: |
      T_eq_int( ctx->status, 0 );
    text: |
      The return value of ${../if/posix-memalign:/name} shall be equal to zero.
  - name: EINVAL
    test-code: |
      T_eq_int( ctx->status, EINVAL );
    text: |
      The return value of ${../if/posix-memalign:/name} shall be equal to
      ${../if/einval:/name}.
  - name: ENOMEM
    test-code: |
      T_eq_int( ctx->status, ENOMEM );
    text: |
      The return value of ${../if/posix-memalign:/name} shall be equal to
      ${../if/enomem:/name}.
  test-epilogue: null
  test-prologue: null
- name: MemptrVar
  states:
  - name: AreaBegin
    test-code: |
      T_eq_ptr( ctx->memptr, &ctx->memptr_obj );
      T_not_null( ctx->memptr_obj );
    text: |
      The value of the object referenced by the memptr parameter shall be set
      to the begin address of the allocated memory area after the return of the
      ${../if/posix-memalign:/name} call.
  - name: 'Null'
    test-code: |
      T_eq_ptr( ctx->memptr, &ctx->memptr_obj );
      T_null( ctx->memptr_obj );
    text: |
      The value of the object referenced by the memptr parameter shall be set
      to ${../if/null:/name} after the return of the
      ${../if/posix-memalign:/name} call.
  - name: Nop
    test-code: |
      T_eq_uptr( (uintptr_t) ctx->memptr_obj, 1 );
    text: |
      Objects referenced by the memptr parameter in past calls to
      ${../if/posix-memalign:/name} shall not be accessed by the
      ${../if/posix-memalign:/name} call.
  test-epilogue: null
  test-prologue: null
- name: Alignment
  states:
  - name: Valid
    test-code: |
      T_eq_uptr( (uintptr_t) ctx->memptr_obj % 128, 0 );
    text: |
      The begin address of the allocated memory area shall be an integral
      multiple of the alignment parameter.
  test-epilogue: null
  test-prologue: null
- name: Size
  states:
  - name: Valid
    test-code: |
      /* Assume that the next allocation is done from adjacent memory */
      ptr = ctx->memptr_obj;
      eno = posix_memalign( &ptr, ctx->alignment, ctx->size );
      T_eq_int( eno, 0 );
      T_not_null( ptr );
      a = (uintptr_t) ptr;
      b = (uintptr_t) ctx->memptr_obj;
      size = a < b ? b - a : a - b;
      T_ge_uptr( size, ctx->size );
    text: |
      The size of the allocated memory area shall greater than or equal to the
      size parameter.
  test-epilogue: null
  test-prologue: |
    void     *ptr;
    int       eno;
    uintptr_t a;
    uintptr_t b;
    uintptr_t size;
pre-conditions:
- name: Memptr
  states:
  - name: Valid
    test-code: |
      ctx->memptr = &ctx->memptr_obj;
    text: |
      While the memptr parameter references an object of type
      ``void *``.
  - name: 'Null'
    test-code: |
      ctx->memptr = NULL;
    text: |
      While the memptr parameter is equal to ${/c/if/null:/name}.
  test-epilogue: null
  test-prologue: null
- name: Alignment
  states:
  - name: Tiny
    test-code: |
      ctx->alignment = sizeof( void * ) - 1;
    text: |
      While the alignment parameter is less than sizeof( void * ).
  - name: NotPower2
    test-code: |
      ctx->alignment = sizeof( void * ) + 1;
    text: |
      While the alignment parameter is greater than or equal to
      sizeof( void * ), while the alignment parameter is not a power of two.
  - name: Huge
    test-code: |
      ctx->alignment = SIZE_MAX / 2 + 1;
    text: |
      While the alignment parameter is greater than or equal to
      sizeof( void * ), while the alignment parameter is a power of two, while
      the alignment parameter is too large to allocate a memory area with the
      specified alignment.
  - name: Valid
    test-code: |
      ctx->alignment = 128;
    text: |
      While the alignment parameter is greater than or equal to
      sizeof( void * ), while the alignment parameter is a power of two, while
      the alignment parameter is small enough to allocate a memory area with
      the specified alignment.
  test-epilogue: null
  test-prologue: null
- name: Size
  states:
  - name: Huge
    test-code: |
      ctx->size = SIZE_MAX;
    text: |
      While the size parameter is not equal to zero, while the size parameter
      is too large to allocate a memory area with the specified size.
  - name: Zero
    test-code: |
      ctx->size = 0;
    text: |
      While the size parameter is equal to zero.
  - name: Valid
    test-code: |
      ctx->size = sizeof( uint64_t );
    text: |
      While the size parameter is not equal to zero, while the size parameter
      is small enough to allocate a memory area with the specified size.
  test-epilogue: null
  test-prologue: null
rationale: null
references: []
requirement-type: functional
skip-reasons: {}
test-action: |
  ctx->status = posix_memalign( ctx->memptr, ctx->alignment, ctx->size );
test-brief: null
test-cleanup: null
test-context:
- brief: |
    This member provides a memory support context.
  description: null
  member: |
    MemoryContext mem_ctx;
- brief: |
    This member provides the object referenced by the memptr parameter.
  description: null
  member: |
    void *memptr_obj
- brief: |
    This member contains the return value of the directive call.
  description: null
  member: |
    int status
- brief: |
    This member specifies if the memptr parameter value.
  description: null
  member: |
    void **memptr
- brief: |
    This member specifies if the alignment parameter value.
  description: null
  member: |
    size_t alignment
- brief: |
    This member specifies if the size parameter value.
  description: null
  member: |
    size_t size
test-context-support: null
test-description: null
test-header: null
test-includes:
- stdlib.h
- errno.h
test-local-includes:
- tx-support.h
test-prepare: |
  ctx->memptr_obj = (void *)(uintptr_t) 1;
test-setup:
  brief: null
  code: |
    MemorySave( &ctx->mem_ctx );
  description: null
test-stop: null
test-support: null
test-target: testsuites/validation/tc-mem-posix-memalign.c
test-teardown:
  brief: null
  code: |
    MemoryRestore( &ctx->mem_ctx );
  description: null
text: ${.:text-template}
transition-map:
- enabled-by: true
  post-conditions:
    Status: EINVAL
    MemptrVar: 'Null'
    Alignment: N/A
    Size: N/A
  pre-conditions:
    Memptr:
    - Valid
    Alignment:
    - Tiny
    - NotPower2
    Size: all
- enabled-by: true
  post-conditions:
    Status: EINVAL
    MemptrVar: Nop
    Alignment: N/A
    Size: N/A
  pre-conditions:
    Memptr:
    - 'Null'
    Alignment: all
    Size: all
- enabled-by: true
  post-conditions:
    Status: ENOMEM
    MemptrVar: 'Null'
    Alignment: N/A
    Size: N/A
  pre-conditions:
    Memptr:
    - Valid
    Alignment:
    - Huge
    Size:
    - Huge
    - Valid
- enabled-by: true
  post-conditions:
    Status: ENOMEM
    MemptrVar: 'Null'
    Alignment: N/A
    Size: N/A
  pre-conditions:
    Memptr:
    - Valid
    Alignment:
    - Valid
    Size:
    - Huge
- enabled-by: true
  post-conditions:
    Status: Zero
    MemptrVar: AreaBegin
    Alignment: Valid
    Size: Valid
  pre-conditions:
    Memptr:
    - Valid
    Alignment:
    - Valid
    Size:
    - Valid
- enabled-by: true
  post-conditions:
    Status: Zero
    MemptrVar: 'Null'
    Alignment: Valid
    Size: N/A
  pre-conditions:
    Memptr:
    - Valid
    Alignment:
    - Valid
    - Huge
    Size:
    - Zero
type: requirement