diff options
-rw-r--r-- | CMakeLists.txt | 21 | ||||
-rw-r--r-- | Changelog | 2 | ||||
-rw-r--r-- | ClazySources.cmake | 158 | ||||
-rw-r--r-- | src/Clazy.h | 5 | ||||
-rwxr-xr-x | tests/run_tests.py | 6 | ||||
-rw-r--r-- | windows-package/README.txt | 2 |
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) @@ -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. |