aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt21
-rw-r--r--Changelog2
-rw-r--r--ClazySources.cmake158
-rw-r--r--src/Clazy.h5
-rwxr-xr-xtests/run_tests.py6
-rw-r--r--windows-package/README.txt2
6 files changed, 107 insertions, 87 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 40d681eb..0743f360 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -30,7 +30,6 @@ add_definitions(-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS)
add_definitions(-D_GNU_SOURCE -DHAVE_CLANG_CONFIG_H)
option(CLAZY_BUILD_UTILS_LIB "Enable this option to build a library so you can reuse clazy's utility functions" OFF)
-option(CLAZY_BUILD_IS_MINIMAL "Enable this option to build clazy without any checks" OFF)
if (CLAZY_BUILD_UTILS_LIB)
add_definitions(-DCLAZY_BUILD_UTILS_LIB)
@@ -117,6 +116,9 @@ macro(link_to_llvm name llvm_libs)
target_link_libraries(${name} ${llvm_system_lib})
endforeach()
+ if(MSVC)
+ target_link_libraries(${name} version.lib)
+ endif()
endmacro()
macro(add_clang_plugin name)
@@ -131,15 +133,12 @@ macro(add_clang_plugin name)
link_to_llvm(${name} "${LLVM_LIBS_LIST}")
if(MSVC)
- target_link_libraries(${name} version.lib)
target_link_libraries(${name} ${CLANG_LIBRARY_IMPORT}) # Link against clang.exe to share the plugin registry
endif()
if(CLAZY_BUILD_UTILS_LIB)
target_link_libraries(${name} clazylib)
endif()
-
- generate_export_header(${name})
endmacro()
if(CLAZY_BUILD_UTILS_LIB)
@@ -163,7 +162,7 @@ endif()
set(SYMBOL_FILE Lazy.exports)
-add_clang_plugin(ClangLazy ${CLAZY_SRCS})
+add_clang_plugin(ClangLazy ${CLAZY_PLUGIN_SRCS})
set_target_properties(ClangLazy PROPERTIES
LINKER_LANGUAGE CXX
@@ -234,9 +233,15 @@ endif()
# Build clazy-standalone
-add_executable(clazy-standalone src/ClazyStandaloneMain.cpp)
-target_link_libraries(clazy-standalone ClangLazy)
-link_to_llvm(clazy-standalone "${CLAZY_STANDALONE_LLVM_LIBS}")
+add_executable(clazy-standalone ${CLAZY_STANDALONE_SRCS})
+if (MSVC)
+ # On MSVC clang-standalone crashes with a meaningless backtrace if linked to ClangLazy.dll
+ target_link_libraries(clazy-standalone clangFrontend)
+else()
+ target_link_libraries(clazy-standalone ClangLazy)
+endif()
+
+link_to_llvm(clazy-standalone "${CLAZY_STANDALONE_LLVM_LIBS}")
install(TARGETS clazy-standalone DESTINATION bin PERMISSIONS OWNER_WRITE OWNER_EXECUTE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE)
diff --git a/Changelog b/Changelog
index 6636d998..19548886 100644
--- a/Changelog
+++ b/Changelog
@@ -24,7 +24,7 @@
- Fixed many false positives
-* v1.2 ()
+* v1.2 (July 8th, 2017)
- clazy-standalone executable. Allows to run clazy against a JSON compilation database
instead of as a plugin. clang-tidy doesn't support loading external modules (https://bugs.llvm.org/show_bug.cgi?id=32739)
so this is a good workaround.
diff --git a/ClazySources.cmake b/ClazySources.cmake
index 674cd79c..5fde857a 100644
--- a/ClazySources.cmake
+++ b/ClazySources.cmake
@@ -14,84 +14,96 @@ set(CLAZY_LIB_SRC
${CMAKE_CURRENT_LIST_DIR}/src/Utils.cpp
)
-if (NOT CLAZY_BUILD_IS_MINIMAL)
- set(CLAZY_SRCS
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qcolor-from-literal.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/connect-non-signal.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/connect-not-normalized.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/container-anti-pattern.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/lambda-in-connect.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qdatetimeutc.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qenums.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qfileinfo-exists.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qgetenv.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qmap-with-pointer-key.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qstringarg.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qstring-insensitive-allocation.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qstringref.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qt-macros.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qvariant-template-instantiation.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/mutable-container-key.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/strict-iterators.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/temporaryiterator.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/unused-non-trivial-variable.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/writingtotemporary.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/wrong-qglobalstatic.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/autounexpectedqstringbuilder.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/child-event-qobject-cast.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/detachingtemporary.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/foreach.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/inefficient-qlist-soft.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/install-event-filter.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/ctor-missing-parent-argument.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/missing-qobject-macro.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/nonpodstatic.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/qdeleteall.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/qstring-left.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/qlatin1string-non-ascii.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/range-loop.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/returning-data-from-temporary.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/ruleoftwosoft.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/post-event.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/incorrect-emit.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/base-class-event.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/container-inside-loop.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/function-args-by-ref.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/function-args-by-value.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/globalconstcharpointer.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/implicitcasts.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/missing-type-info.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/qstring-allocations.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/reservecandidates.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/ruleofthree.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/virtualcallsfromctor.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/returning-void-expression.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/copyable-polymorphic.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level3/assertwithsideeffects.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level3/detachingmember.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/level3/dynamic_cast.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/hiddenlevel/inefficientqlist.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/hiddenlevel/isempty-vs-count.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/hiddenlevel/tr-non-literal.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/hiddenlevel/qt4-qstring-from-array.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/detachingbase.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/inefficientqlistbase.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/requiredresults.cpp
- ${CMAKE_CURRENT_LIST_DIR}/src/checks/ruleofbase.cpp
- )
+set(CLAZY_CHECKS_SRCS
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qcolor-from-literal.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/connect-non-signal.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/connect-not-normalized.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/container-anti-pattern.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/lambda-in-connect.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qdatetimeutc.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qenums.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qfileinfo-exists.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qgetenv.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qmap-with-pointer-key.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qstringarg.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qstring-insensitive-allocation.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qstringref.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qt-macros.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/qvariant-template-instantiation.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/mutable-container-key.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/strict-iterators.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/temporaryiterator.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/unused-non-trivial-variable.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/writingtotemporary.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level0/wrong-qglobalstatic.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/autounexpectedqstringbuilder.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/child-event-qobject-cast.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/detachingtemporary.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/foreach.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/inefficient-qlist-soft.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/install-event-filter.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/ctor-missing-parent-argument.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/missing-qobject-macro.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/nonpodstatic.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/qdeleteall.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/qstring-left.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/qlatin1string-non-ascii.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/range-loop.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/returning-data-from-temporary.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/ruleoftwosoft.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/post-event.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level1/incorrect-emit.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/base-class-event.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/container-inside-loop.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/function-args-by-ref.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/function-args-by-value.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/globalconstcharpointer.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/implicitcasts.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/missing-type-info.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/qstring-allocations.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/reservecandidates.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/ruleofthree.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/virtualcallsfromctor.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/returning-void-expression.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/copyable-polymorphic.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level3/assertwithsideeffects.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level3/detachingmember.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/level3/dynamic_cast.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/hiddenlevel/inefficientqlist.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/hiddenlevel/isempty-vs-count.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/hiddenlevel/tr-non-literal.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/hiddenlevel/qt4-qstring-from-array.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/detachingbase.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/inefficientqlistbase.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/requiredresults.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/checks/ruleofbase.cpp
+)
+
+if(HAS_STD_REGEX)
+ set(CLAZY_CHECKS_SRCS ${CLAZY_CHECKS_SRCS} ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/oldstyleconnect.cpp)
endif()
-set(CLAZY_SRCS ${CLAZY_SRCS}
- ${CMAKE_CURRENT_LIST_DIR}/src/Clazy.cpp
+set(CLAZY_SHARED_SRCS # sources shared between clazy-standalone and clazy plugin
+ ${CLAZY_CHECKS_SRCS}
${CMAKE_CURRENT_LIST_DIR}/src/ClazyContext.cpp
+ ${CMAKE_CURRENT_LIST_DIR}/src/Clazy.cpp
)
-if (NOT CLAZY_BUILD_IS_MINIMAL)
- if(HAS_STD_REGEX)
- set(CLAZY_SRCS ${CLAZY_SRCS} ${CMAKE_CURRENT_LIST_DIR}/src/checks/level2/oldstyleconnect.cpp)
- endif()
+if (NOT CLAZY_BUILD_UTILS_LIB)
+ set(CLAZY_SHARED_SRCS ${CLAZY_SHARED_SRCS} ${CLAZY_LIB_SRC})
endif()
-if (NOT CLAZY_BUILD_UTILS_LIB)
- set(CLAZY_SRCS ${CLAZY_SRCS} ${CLAZY_LIB_SRC})
+set(CLAZY_PLUGIN_SRCS # Sources for the plugin
+ ${CLAZY_SHARED_SRCS}
+)
+
+if (MSVC)
+ set(CLAZY_STANDALONE_SRCS
+ ${CLAZY_SHARED_SRCS}
+ ${CMAKE_CURRENT_LIST_DIR}/src/ClazyStandaloneMain.cpp
+ )
+else()
+ set(CLAZY_STANDALONE_SRCS
+ ${CMAKE_CURRENT_LIST_DIR}/src/ClazyStandaloneMain.cpp
+ )
endif()
diff --git a/src/Clazy.h b/src/Clazy.h
index c2844f94..fd9cc24b 100644
--- a/src/Clazy.h
+++ b/src/Clazy.h
@@ -25,7 +25,6 @@
#ifndef CLAZY_AST_ACTION_H
#define CLAZY_AST_ACTION_H
-#include "clanglazy_export.h"
#include "checkmanager.h"
#include <clang/AST/ASTConsumer.h>
@@ -45,7 +44,7 @@ class ClazyContext;
/**
* This is the FrontendAction that is run with clazy is used as a plugin.
*/
-class CLANGLAZY_EXPORT ClazyASTAction : public clang::PluginASTAction
+class ClazyASTAction : public clang::PluginASTAction
{
public:
@@ -73,7 +72,7 @@ private:
* This is the FrontendAction that is run with clazy is used standalone instead of as a plugin.
* i.e: when you run clazy-standalone, this is the invoked FrontendAction
*/
-class CLANGLAZY_EXPORT ClazyStandaloneASTAction : public clang::ASTFrontendAction
+class ClazyStandaloneASTAction : public clang::ASTFrontendAction
{
public:
explicit ClazyStandaloneASTAction(const std::string &checkList, ClazyContext::ClazyOptions = ClazyContext::ClazyOption_None);
diff --git a/tests/run_tests.py b/tests/run_tests.py
index 480a2338..b448ce62 100755
--- a/tests/run_tests.py
+++ b/tests/run_tests.py
@@ -336,12 +336,16 @@ def get_fixed_files():
def print_differences(file1, file2):
return run_command("diff -Naur {} {}".format(file1, file2))
+def normalizedCwd():
+ return os.getcwd().replace('\\', '/')
+
def extract_word(word, in_file, out_file):
in_f = open(in_file, 'r')
out_f = open(out_file, 'w')
for line in in_f:
if word in line:
- line = line.replace(os.getcwd() + "/", "") # clazy-standalone prints the complete cpp file path for some reason. Normalize it so it compares OK with the expected output.
+ line = line.replace('\\', '/')
+ line = line.replace(normalizedCwd() + '/', "") # clazy-standalone prints the complete cpp file path for some reason. Normalize it so it compares OK with the expected output.
out_f.write(line)
in_f.close()
out_f.close()
diff --git a/windows-package/README.txt b/windows-package/README.txt
index c3696c96..f8cb80b4 100644
--- a/windows-package/README.txt
+++ b/windows-package/README.txt
@@ -1,5 +1,5 @@
This package distributes the clang compiler and a compiler plugin called clazy.
-clang and llvm were built from branch release_40 (https://github.com/llvm-mirror/llvm.git f3d3277bb713bb8aced9a7ac2e9b05c52d2844ee and https://github.com/llvm-mirror/clang.git 3c8961bedc65c9a15cbe67a2ef385a0938f7cfef.
+clang and llvm were built from branch release_40 (https://github.com/llvm-mirror/llvm.git c8fccc53ed66d505898f8850bcc690c977a7c9a7 and https://github.com/llvm-mirror/clang.git 3c8961bedc65c9a15cbe67a2ef385a0938f7cfef.
See LICENSE-LLVM.TXT for clang's license.
See LICENSE-CLAZY.txt for clazy's license.