File: sized_aligned_new_delete_misaligned1.cpp

package info (click to toggle)
valgrind 1%3A3.24.0-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 176,332 kB
  • sloc: ansic: 795,029; exp: 26,134; xml: 23,472; asm: 14,393; cpp: 9,397; makefile: 7,464; sh: 6,122; perl: 5,446; python: 1,498; javascript: 981; awk: 166; csh: 1
file content (58 lines) | stat: -rw-r--r-- 1,668 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <new>
#include <cassert>
#include <cstdlib>
#include "valgrind.h"

int main() {
    std::align_val_t misalign(static_cast<std::align_val_t>(63U));
    std::align_val_t zeroalign(static_cast<std::align_val_t>(0U));
    std::align_val_t onealign(static_cast<std::align_val_t>(1U));
    std::align_val_t align(static_cast<std::align_val_t>(64U));
    std::size_t size(32);
    std::nothrow_t tag;
    void *mem = nullptr;
    
    // libc++ will allocate something for size zero
    // but libstdc++ doesn't
    mem = operator new(size, zeroalign, tag);
    if (RUNNING_ON_VALGRIND) {
       assert(!mem);
    }
    operator delete(mem, zeroalign, tag);
    mem = nullptr;
    
    mem = operator new(size, onealign, tag);
    assert(mem);
    operator delete(mem, onealign, tag);
    mem = nullptr;
    
    mem = operator new(size, align);
    operator delete(mem, misalign);
    mem = nullptr;
    
    mem = operator new[](size, align);
    operator delete[](mem, misalign);
    mem = nullptr;
    
    // doesn't matter that tag is uninit
    // don't want to see an error
    mem = operator new(size, misalign, tag);
    operator delete(mem, misalign, tag);
    assert(!mem);

    mem = operator new[](size, misalign, tag);
    operator delete[](mem, misalign, tag);
    assert(!mem);
    
    mem = operator new(size, align);
    operator delete(mem, size, misalign);
    mem = nullptr;
    
    mem = operator new[](size, align);
    operator delete[](mem, size, misalign);
    
    // initially this test had two throwing
    // versions called from fork()s
    // but that doesn't mix well with xml
    // so they have split out int versions 2 and 3
}