<div dir="ltr"><div>Hello,</div><div><br></div><div>I'd like to write a rule for either clang-tidy or static analyzer to help catch some potential errors in a project I'm working on.</div><div><br></div><div>My questions are: <br></div><div> a) is only one or the other will be able to do what I want to do?<br></div><div> b) if both are feasible which would have the simpler implementation?</div><div><br></div><div>The project involves writing an API that will run in a multi-threaded application and is responsible for serializing all access to a device structure. Therefore the first thing in every function in the API must be to call api_enter (which will among other things acquire a mutex on the device) and the last thing before returning must be to call api_exit. Also I want to enforce single exit point from every API function - or certainly if there are any return points that bypass the api_exit call.<br></div><div><br></div><div>So here is an example function with errors I want to catch highlighted.</div><div><br></div><div>int api_foo(device_t *dev) {</div><div> int ret_val = 0;<br></div><div><br></div><div> bar();
// fn calls & decls before api_enter is ok- just don't access dev.</div><div> dev->bla = 1; // NO! device access before api_enter() called</div><div> api_enter(dev); // error if this call is not present exactly once</div><div><br></div><div> if (dev->bla)</div><div> return; // NO! didn't call api_exit before rtn. Also two return points</div><div><br></div><div> if (dev->ma) {</div><div> ret_val = 1;<br></div><div> goto cleanup;</div><div> }</div><div> tweak(dev);<br></div><div><br></div><div>cleanup:</div><div> api_exit(dev); // error if this is not present exactly once<br></div><div> dev->bla = 1; //NO! device access after api_exit()<br></div><div> return ret_val;<br></div><div>}</div><div><br></div><div>I don't think it matters but the project is C compiled with gcc.<br></div><div><br></div><div>Also if both are feasible any other pointers, tips or good resources would be appreciated. E.g is there a totally different methodology I'm not considering - e.g. would using something like pycparser be a lot easier - though I'd prefer to keep it in clang as we plan to use tidy & static analyzer in any case for standard QA.<br></div><div><br></div><div>Thanks for reading,</div><div>Billy.<br></div></div>