When using BLE_GATTS_VLOC_USER I would tend to make the variable pointed to by ble_gatts_attr_t.p_value volatile to reflect the situation that the value can be changed by softdevice interrupt handlers at any time, but this entails all kinds of additional casts, e.g. to memset the value. Also, ble_gatts_attr_t.p_value itself isn't volatile.
Is my thinking process wrong?