Memory tag checks are done by the CPU but software must set those tags and choose their values appropriately.
Software may set an allocation tag to any value in the range 0-15. It is convention that the tag 0 is used for newly initialised memory. Therefore, software may choose to use it only for that purpose.
Each allocation tag applies to a "granule". This granule is 16 bytes in size and is at a 16 byte aligned address.