An audit of a standard access-control pattern — the most common way contracts get taken over.
A function lets anyone change the owner:
changeOwner(address) is public with no onlyOwnerOwnership is the highest-privilege role. A missing modifier on the owner-change path is a direct takeover.
Critical — "Owner changed without access control — anyone can seize ownership." Also catches the subtler variant: owner never initialized in the constructor, so msg.sender == owner is always false and the "protected" function is actually unusable — or the reverse, owner defaults to zero and checks pass for nobody.
Access control is the #1 class of smart-contract exploits. AI catches both the obvious missing-modifier and the subtle uninitialized-owner variants.