<div dir="ltr">Hi Roman<br><div><br><div class="gmail_quote"><div dir="ltr">On Thu, Jun 22, 2017 at 4:56 PM Roman Lebedev <<a href="mailto:lebedev.ri@gmail.com">lebedev.ri@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thu, Jun 22, 2017 at 5:40 PM, Marc-André Lureau via cfe-dev<br>
<<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>> wrote:<br>
> Hi,<br>
><br>
> I have started to investigate using clang-tidy for some QEMU checks and<br>
> modernization, with some success. I started sending patches to the QEMU ML<br>
> (<a href="https://lists.nongnu.org/archive/html/qemu-devel/2017-06/msg05034.html" rel="noreferrer" target="_blank">https://lists.nongnu.org/archive/html/qemu-devel/2017-06/msg05034.html</a>).<br>
> The QEMU maintainer, Peter, challenged me to see if we could write a check<br>
> for coroutine usage: check if there are calls to a coroutine-marked function<br>
> from a non-coroutine (which would be a bug, as coroutine may yield).<br>
> Coroutine function are marked with a "coroutine_fn" macro, this a simple<br>
> example:<br>
><br>
> #define coroutine_fn<br>
><br>
> void coroutine_fn qemu_coroutine_yield(void);<br>
><br>
> int main(int argc, char *argv[])<br>
> {<br>
>     qemu_coroutine_yield();<br>
>     return 0;<br>
> }<br>
><br>
><br>
> Here, qemu_coroutine_yield() should be an error, because main() is not a<br>
> coroutine_fn.<br>
><br>
> Is there a way to write a clang-tidy check, perhaps at PP level, that would<br>
> mark the function declaration with coroutine type?<br>
While not clang-tidy answer, i wonder if this is an appropriate use-case for<br>
<a href="https://clang.llvm.org/docs/ThreadSafetyAnalysis.html" rel="noreferrer" target="_blank">https://clang.llvm.org/docs/ThreadSafetyAnalysis.html</a><br>
<br>
(The following is undested, and is pure speculation)<br>
<br>
Have some global symbol, like<br>
typedef int __attribute__((capability("role"))) coroutine_role;<br>
coroutine_role _coroutine_fn;<br>
<br>
And then defining:<br>
#define coroutine_fn REQUIRES(_coroutine_fn)<br>
<br>
And compiling with -Wthread-safety.<br>
<br></blockquote><div><br></div><div>It almost does the job, thanks for the tip. The documentation seems to be scarce though.<br><br></div><div>The major issue I see right now, is that you can't annotate function pointers type or fields with requires_capability for instance.<br><br></div><div>QEMU has typedef void coroutine_fn CoroutineEntry(void *opaque); it would be nice if the analyser could check the function passed has the same annotation.<br><br></div><div>Secondly, when calling such pointer, use the same analysis as with regular functions annotation.<br><br></div><div>I suppose this isn't too hard to add, and I started digging in clang code, but help welcome.<br><br>Who should I CC for help? (I added Aaron, since it seems you have done some related work some time ago)<br><br></div><div>thanks<br></div></div></div></div><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr">Marc-André Lureau<br></div></div>