================
Comment at: clang-tidy/ClangTidy.cpp:61
@@ -57,10 +60,3 @@
 
-static StringRef StaticAnalyzerChecks[] = {
-#define GET_CHECKERS
-#define CHECKER(FULLNAME, CLASS, DESCFILE, HELPTEXT, GROUPINDEX, HIDDEN)       
\
-  FULLNAME,
-#include "../../../lib/StaticAnalyzer/Checkers/Checkers.inc"
-#undef CHECKER
-#undef GET_CHECKERS
-};
+static std::vector<std::string> StaticAnalyzerChecks;
 
----------------
xazax.hun wrote:
> alexfh wrote:
> > It was fine to have this as a global variable while it was a compile-time 
> > constant. But it's a bad idea to use a global mutable variable to pass 
> > configuration to the library. Actually, I'd leave the compile-time checks 
> > list as a fallback, and only override it if clang-tidy is instructed to use 
> > a static analyzer plugin.
> It is a good idea to fall back to the checker list generated from header 
> files.
> 
> What do you think, where should I put the mutable vector? In ClangTidyOptions?
See the comment below.

Also, please make this variable an array of StringRefs again.

================
Comment at: clang-tidy/ClangTidy.cpp:409
@@ -412,1 +408,3 @@
 
+void populateStaticAnalyzerCheckerList(StringRef Plugin, const char **Argv) {
+  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions());
----------------
xazax.hun wrote:
> alexfh wrote:
> > Is the only useful effect of this function to fill the StaticAnalyzerChecks 
> > variable? It's bad on its own as any other interface which only useful 
> > effect is side-effect.
> > 
> > AFAIU, you still rely on the compilation arguments to instruct the static 
> > analyzer that it needs to load a plugin? That doesn't sound like a good 
> > idea either for multiple reasons, most importantly that:
> >   1. This requires modification of the compilation arguments in the build 
> > system in order to run an analysis implemented in a plugin. Looks like an 
> > overkill and a totally wrong way of doing this.
> >   2. Compile arguments will affect what is loaded and executed by 
> > clang-tidy, which also seems wrong. If it is already the case, it was 
> > definitely unintended and we need to fix this instead of relying on this.
> >   3. 1 and 2 also mean that for correct usage clang-tidy's -plugin-path 
> > option will always need to be in sync with the -load options in the 
> > compilation database (read: in the build system). Extremely brittle and 
> > confusing.
> > 
> > 
> Yes, the only effect of this function is to initialize the checker list. What 
> else would you prefer? Once the mutable list is the member of 
> ClangTidyOptions, I could make this function a method.
> 
> With plugin-path argument, the command line of compilation do not need to be 
> modified from the user's point of view. I only forgot to update the test 
> case. Once the plugin path is given in the command line, this method should 
> just work with any kind of unmodified compilation database.
> 
> The reason why it is not needed to add the -load argument to the command line:
> 
> This function loads the plugin which is kept in the memory for the whole 
> runtime. Upon plugin load, the checkers are registered. So even though the 
> load argument is not given to the frontend action that does the checking, the 
> plugin already in the memory and the checkers already are registered, so they 
> will be used.
> 
> If you find this method hacky or not future proof, I could create an argument 
> adjuster object here which could be used during the next steps. However 
> StaticAnalyzerChecks have to be initialized early enough so that the user can 
> list the checkers that are loaded from the plugin.
> Yes, the only effect of this function is to initialize the checker list.

Well, this contradicts to the explanation of how plugins are loaded that you 
give below ;) But now I get it, and looks like the function should be called 
"loadPlugins" or similar in order to make the important side-effect obvious 
from the function name. And as we now rely on a mutable global state anyway, it 
may be fine to introduce (#ifdefed only when plugins are enabled) an additional 
global vector to store dynamically constructed static analyzer check list. At 
least I don't see a substantially better alternative.

Filtering out -load arguments from the arguments we get from a compilation 
database looks like a useful thing to do unless there's a better way to disable 
loading of plugins during the analysis.

================
Comment at: clang-tidy/tool/ClangTidyMain.cpp:149
@@ -148,1 +148,3 @@
 
+static cl::opt<std::string> PluginPath(
+    "plugin-path",
----------------
xazax.hun wrote:
> alexfh wrote:
> > Does static analyzer support only one plugin at a time?
> > 
> > Also, it _may_ be better to put this into ClangTidyOptions, but I'm not 
> > sure yet. Upsides are that then we'd avoid modification of most other 
> > interfaces. Obvious downsides are that this option only makes sense for the 
> > command-line front-end.
> > 
> > Can you explain your use case in more detail?
> I never tried to use multiple plugins, however you are right, the static 
> analyzer supports to load multiple ones at the same time. I see your point to 
> put this into ClangTidyOptions, so one can configure it using yaml files.
> 
> My usecase is the following:
> We have a script, that uses LD_PRELOAD to load a shared object that hijacks 
> the exec function call family and filters and logs compiler calls. After this 
> log file is created a script invokes clang tidy with slightly modified 
> compilation arguments. This way we can support any build system on posix 
> systems including incremental build support.We just got the permission to 
> open source this tool set, so it is possible that we will try to upstream 
> this tool soon. 
I'm still not sure about moving the "-plugin-path" option to `ClangTidyOptions`.

> My usecase is the following:
> We have a script, that uses LD_PRELOAD to load a shared object that 
> hijacks the exec function call family and filters and logs compiler calls. 

Similar to this one? https://github.com/rizsotto/Bear

> After this log file is created a script invokes clang tidy with slightly 
> modified compilation arguments. This way we can support any build 
> system on posix systems including incremental build support.

You mean you run analyses on each build? Sounds interesting, though there's a 
(possibly more effective) alternative: to run analyses as a part of submitting 
the code for review.

But anyway, that doesn't answer why do you need plugins and how you use them.

http://reviews.llvm.org/D9555

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to