Low-level code may occasionally deal with direct access by concrete addresses such as 0x1234. Values at these addresses act like globals: they can change at any time. They typically wear volatile qualifiers.
Suppress all warnings on loops with conditions that involve casting anything to a pointer-to-...-pointer-to-volatile type.
We should probably suppress loops that dereference concrete addresses regardless of volatile qualifiers but it's pretty difficult to figure out whether the address is indeed concrete (say, it may have an unknown offset, eg. (char *)(0x1234 + i), and now it can be interpreted as either ((char *)0x1234)[i] or ((char *)i)[0x1234] so it's unclear whether this should be suppressed). I also suspect that such code's behavior is undefined so this isn't a very important case to support. So for now i'm sticking to supporting the explicitly volatile-qualified case which seems straightforward.
The closely related bugprone-redundant-branch-condition check doesn't seem to be affected. I added a test just in case.