The attached patch adds basic support for handling strnlen as a built-in function. It touches the strlen pass where it folds constant results of the function, and builtins.c to add simple support for expanding strnlen calls with known results. It also changes calls.c to detect excessive bounds to the function and unsafe calls with arguments declared attribute nonstring. A side-effect of the strlen change I should call out is that strlen() calls to all zero-length arrays that aren't considered flexible array members (i.e., internal members or non-members) are folded into zero. No warning is issued for such invalid uses of zero-length arrays but based on the responses to my question Re: aliasing between internal zero-length-arrays and other members(*) it sounds like one would be appropriate. I will see about adding one in a separate patch. Martin [*] https://gcc.gnu.org/ml/gcc/2018-06/msg00046.html