Example: revoke1.c

up: index
prev: cast1.c
next: revoke2.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <cheriintrin.h>
    #include "capprint.h"
    
    int main()
    {
        void *p = malloc(10);
        fprintf(stderr,"Before free: %" PTR_FMT "\n", sptr(p));
        free(p);
        fprintf(stderr,"After free: %" PTR_FMT "\n", sptr(p));
    #ifdef WITH_CORNUCOPIA
        cheri_revoke();
        fprintf(stderr,"After cheri_revoke: %" PTR_FMT "\n", sptr(p));
    #endif    
    }

Experimental data (what does this mean?)

cerberus-cheri-cornucopia-no-pnvi Before free: (@disabled, 0xffffe6c0 [rwRW,0xffffe6c0-0xffffe6ca])
After free: (@disabled, 0xffffe6c0 [rwRW,0xffffe6c0-0xffffe6ca])
After cheri_revoke: (@disabled, 0xffffe6c0 [rwRW,0xffffe6c0-0xffffe6ca] (invalid))
 
cerberus-cheri-cornucopia Before free: (@84, 0xffffe6c0 [rwRW,0xffffe6c0-0xffffe6ca])
After free: (@84, 0xffffe6c0 [rwRW,0xffffe6c0-0xffffe6ca])
After cheri_revoke: (@84, 0xffffe6c0 [rwRW,0xffffe6c0-0xffffe6ca] (invalid))
 
cerberus-cheri-revocation-no-pnvi Before free: (@disabled, 0xffffe6e0 [rwRW,0xffffe6e0-0xffffe6ea])
After free: (@disabled, 0xffffe6e0 [rwRW,0xffffe6e0-0xffffe6ea] (invalid))
 
cerberus-cheri-revocation Before free: (@83, 0xffffe6e0 [rwRW,0xffffe6e0-0xffffe6ea])
After free: (@83, 0xffffe6e0 [rwRW,0xffffe6e0-0xffffe6ea] (invalid))
 
cerberus-cheri-no-pnvi Before free: (@disabled, 0xffffe6e0 [rwRW,0xffffe6e0-0xffffe6ea])
After free: (@disabled, 0xffffe6e0 [rwRW,0xffffe6e0-0xffffe6ea])
 
cerberus-cheri Before free: (@83, 0xffffe6e0 [rwRW,0xffffe6e0-0xffffe6ea])
After free: (@83, 0xffffe6e0 [rwRW,0xffffe6e0-0xffffe6ea])
 
clang-riscv-O0-bounds-conservative
clang-riscv-O3-bounds-conservative
clang-riscv-O0-bounds-references-only
clang-riscv-O0-bounds-subobject-safe
clang-riscv-O3-bounds-subobject-safe
clang-riscv-O0-bounds-aggressive
clang-riscv-O0-bounds-very-aggressive
clang-riscv-O0-bounds-everywhere-unsafe
 Before free: 0x40a1d000 [rwRW,0x40a1d000-0x40a1d00a]
After free: 0x40a1d000 [rwRW,0x40a1d000-0x40a1d00a]
 
clang-morello-O0-bounds-conservative
clang-morello-O3-bounds-conservative
clang-morello-O0-bounds-references-only
clang-morello-O0-bounds-subobject-safe
clang-morello-O3-bounds-subobject-safe
clang-morello-O0-bounds-aggressive
clang-morello-O0-bounds-very-aggressive
clang-morello-O0-bounds-everywhere-unsafe
 Before free: 0x40c1d000 [rwRW,0x40c1d000-0x40c1d00a]
After free: 0x40c1d000 [rwRW,0x40c1d000-0x40c1d00a]
 
gcc-morello-O0
gcc-morello-O3
 Before free: 0x40000010 [rwRW,0x40000010-0x4000001a]
After free: 0x40000010 [rwRW,0x40000010-0x4000001a]