Eventhough there are no OCR rules in the C standard, to my
knowledge, it is recommended to not include definitions in header files.
This Patch introduces the CheckCCode Option which add C99 to the
language check. Since this checker was original written for C++ it
is off by default.
Details
- Reviewers
alexfh hokein aaron.ballman njames93
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
This is my first PR here, so if I missed something, I will be more than happy to change anything if you point me in the right direction.
I didn't add an extra test so far, because check_clang_tidy.py doesn't support the .h extension so far. And before adding C support to the test helper, I wanted to get feedback if this is something that would even get mainlined, since clang-tidy is mainly for c++.
It would be interesting to add a test for this. I've recently came across the fact that Clang doesn't support common linkage definitions, namely that in C (but not in C++), if you do the following:
int I; void f1(void) {}
int I; void f2(void) {}
and compile these two source files and link them together, the two Is will refer in the resulting binary to the same symbol. (You must not put an initialiser here!) Will int I; being in a header, with no initialiser, be caught?
clang-tools-extra/clang-tidy/misc/DefinitionsInHeadersCheck.h | ||
---|---|---|
26 | ||
clang-tools-extra/docs/clang-tidy/checks/misc-definitions-in-headers.rst | ||
109 |
Currently it will be caught.
1 warning generated. ./foo.h:1:5: warning: variable 'i' defined in a header file; variable definitions in header files can lead to ODR violations [misc-definitions-in-headers] int i;
I guess you don't want that to be cought if it is actually a tentative definition. If I remember correctly for clang and gcc -fno-common is the default.
I think we could do one of two things here either create no warning if there is a VarDelc without initialization or we could try to detect common linkage.
I will have a look if I can detect a change from inside the checker if the linkage of the variable changes via the fcommon compiler flag.
It would be interesting to add a test for this.
I will do so.
Thanks for the feedback.
My personal belief after having encountered common linkage is that it is disgusting and it's good that Clang doesn't support them (by default).
But I do not have any stake or practical experience with working long term on C programs to have a well-educated opinion on this.