 My name is Noel. I see Stefan actually has a talk on Clang Plugins just now, so he'll take you through all the details. I'm just going to run you through some of the stuff that I've done. First, getting started with Clang Plugins is relatively straightforward. There's an excellent tutorial on Libraaf's wiki that you can run through. The only road block that I've run into is that on an Ubuntu install, the Clang Plugins are in a slightly different place to Fedora and Suze, which means I added a sim link but I've added a note to myself to update the autogen, so that finds it on Ubuntu next time. The other nice thing that you need to know is that if you're doing Clang Plugin development, when you want to run it across the whole build and you need to do a clean, don't do a main clean. Somebody nicely added me an internal.clean, which just flushes all of the internal Libraaf's code so it doesn't need to rebuild all the libraries the next time it does its Clang Pass. Now, doing Clang, why do we do Clang? Of course, specifically Clang Plugins. We do Clang Plugins because we want to enforce rules that we can't enforce in a type system. There's a whole bunch of informal rules about using APIs and using classes and structures that we know, but we don't enforce. And so the Clang Plugin allows us to enforce those rules. It also allows us to find common coding issues. Things like co-verity really does an excellent job yet. There's a whole bunch of coding stuff that is quite specific to the Libraaf that we can make improvements by looking for common faults. And there's a whole bunch of stuff that co-verity just doesn't know about yet or they haven't decided it's important enough to look for. But Libraaf is big enough that pretty much any mistake that you can think of is somewhere in the code. It doesn't really matter what crazy idea you come up with. If you create a Clang Plugin for it, you will find at least one instance of it in the code. Now I wrote, some of the bigger things I wrote were SV Stream Output Operators Plugin that converted, that was a re-writer, that converted the SV Stream Output Operators to use explicitly named methods for writing binary fields out. And the reason there was that previously SV Stream was using kind of C++ streams, left-left or right-right type operators, which while very convenient meant that if you changed the data type of a field in one of your classes, you would end up accidentally modifying the binary format that you were writing out, which is not exactly ideal. So we switched all of those operators to have explicit names and no accidental binary changes occur. I wrote a Clang Re-Writer to modify the way we cast when we move between different types in an Uno hierarchy. Stefan wrote the actual casting logic in the Uno Reference class and I wrote a Re-Writer that we tried looking for places to fix that more effectively. Then I wrote some other smaller things which were purely Clang warnings that looked for external and not defined, where you got an external prototype which you might actually be declaring that method. I looked for places that passed by a rare plugin where we passed in OU strings, we were copying them previously, which is completely unnecessary because an OU string is by definition immutable. Now this is actually fairly straightforward. The Clang warning plugins are already so straightforward to write. We're just going to start by looking for a plugin that already does something similar, cut and pasting it and then modifying it. The hardest part is tracking up and down the C++ AST hierarchy. Now luckily most of the names in the Clang AST are quite unique. So if you Google for it, it pretty much just pops up as the top hit and then you track up and down their documentations, looking for places, looking for what exactly you need to modify. Now, when it comes to rewriters, I would suggest you stay away from rewriters especially initially. I found them very painful to write because Lever Office is just so big that there's just a huge variation in the syntax we use. So any change you need to make, you need to be aware of all that, your rewriters basically getting it a bunch of stuff wrong and you're going to have to go in and tweak it. It's very hard to make the rewriters robust. There are a couple of rewriters but it's just difficult. So I would suggest starting out by just writing clean plugins that generate warnings. That's it from me. Any questions?