The script I use to test Clang on many packages:
https://drive.google.com/file/d/0BykPmWrCOxt2Zy1wVXZQWVV0LVE/view?usp=sharing

Background:
In the Cppcheck project we run Cppcheck on all debian packages continuously 
with a script. The results are shown here:
http://cppcheck.sourceforge.net/devinfo/daca2-report/daca2.html

I modified the script that runs Cppcheck so it runs Clang instead.

How to use it:

Create a folder:
mkdir ~/daca-clang

Run Clang on debian source code:
python daca-clang.py --folders=abc --cc_path=~/llvm/build/Debug+Asserts/bin1

--folders=abc:

  Select folders to check. This will select the folders "a", "b" and "c".. 
these contain all packages that start with "a", "b" or "c".

--cc_path=...

  Specify where clang is found

this will only run normal compilation. To run a static analyser checker, add 
--checker=name-of-checker. To run clang-tidy, use --clang-tidy (however this 
currently only runs misc-macro* checkers).


================
Comment at: clang-tidy/misc/MacroRepeatedSideEffectsCheck.cpp:49
@@ +48,3 @@
+  // Don't write warnings for macros defined in system headers
+  if (SM.isInSystemHeader(MI->getDefinitionLoc()))
+    return;
----------------
alexfh wrote:
> danielmarjamaki wrote:
> > alexfh wrote:
> > > What system macros did get flagged here that you wouldn't want? Combining 
> > > MIN/MAX with a side effect seems like a bad idea, for example.
> > For instance: toupper, strchr. I think these were false positives. :-(
> > 
> > For instance for strchr I assume "__builtin_constant_p (s)" does not use s 
> > at runtime and then it's safe to use s again later in the macro.
> > 
> > I don't see how we can teach the checker to not care about any compiletime 
> > behaviour. do you know if this is possible?
> > 
> I can find some definitions of these macros, but I'm not sure they would be 
> the same definitions you are talking about. It would be easier if you quoted 
> the definitions here.
Here is the toupper macro:
```
#  define toupper(c)    __tobody (c, toupper, *__ctype_toupper_loc (), (c))
```
The c is repeated but I assume that __tobody doesnt use both argument 1 and 4 
at runtime.

Here is the strchr macro:
```
#  define strchr(s, c) \
  (__extension__ (__builtin_constant_p (c) && !__builtin_constant_p (s)       \
                  && (c) == '\0'                                              \
                  ? (char *) __rawmemchr (s, c)                               \
                  : __builtin_strchr (s, c)))
```
The s is used in the condition and then in both conditional expressions. 
However I assume that the usage in the condition is compile-time only.

http://reviews.llvm.org/D9496

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