<div dir="ltr">I'd like to implement an attribute to allow Fortify diagnosing of new functions as if they were builtins. I'd appreciage any feedback about the design. <div><br></div><div>An example illustrating a warning I'd like to happen:</div><div>///////////</div><div>void* memset(void* const s __attribute__((pass_object_size(0))),<br>             int c,<br>             int n) __attribute__((overloadable)) {<br>  return __builtin_memset(s, c, n);<br>}<br> <br>int main() {<br>  char s[10];<br>  memset(s, 0, 11);<br>}<br></div><div>//////////</div><div><br></div><div>Ideally Fortify would be able to diagnose the overflow in the call to this overloaded memset. Apparently this used to happen, but it stopped working after this patch (<a href="https://reviews.llvm.org/D77491">https://reviews.llvm.org/D77491</a>). </div><div><br></div><div>The design I'm thinking would involve adding a new diagnose_as_if attribute, so that we could indicate that function calls to one function should be diagnosed as if they were calls to another. For instance, it might look like this:</div><div><br></div><div>//////////void* mymemset(void* const s,</div>             int c,<br>             int n) __attribute__((diagnose_as_if(__builtin_memset(s, c, n)))) {<br>  return __builtin_memset(s, c, n);<br>}<div>///////</div><div><br></div><div>I see several ways the diagnose_as_if attribute could work:</div><div><br></div><div>1. diagnose_as_if(__builtin_memset) (just diagnose `mymemset` as if it's a call to __builtin_memset, with arguments in the same order)</div><div><br></div><div>2. diagnose_as_if(__builtin_memset(0, 1, 2)) (use integers to specify which parameters of the call to `mymemset` go in which argument of `__builtin_memset`)</div><div><br></div><div>3. diagnose_as_if(__builtin_memset(s, c, n) (use parameter names to specify which parameters of the call to `mymemset` go in which argument of `__builtin_memset`)</div><div><br></div><div>4. As an extension to item 3, potentially the arguments of `__builtin_memset` could be more complicated expressions than just names of parameters, like `__builtin_memset(s + 2, c, n)` or something. It seems this would be more complicated to implement. </div><div><br></div><div>It's not immediately clear how much generality would be useful here; would option 3 be sufficient? Or even option 1?</div></div>