<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 4.5 使用動態分析來檢測內存缺陷 **NOTE**:*此示例代碼可以在 https://github.com/dev-cafe/cmake-cookbook/tree/v1.0/chapter-04/recipe-05 中找到,包含一個C++的示例。該示例在CMake 3.5版(或更高版本)中是有效的,并且已經在GNU/Linux、macOS和Windows上進行過測試。* 內存缺陷:寫入或讀取越界,或者內存泄漏(已分配但從未釋放的內存),會產生難以跟蹤的bug,最好盡早將它們檢查出來。Valgrind( http://valgrind.org )是一個通用的工具,用來檢測內存缺陷和內存泄漏。本節中,我們將在使用CMake/CTest測試時使用Valgrind對內存問題進行警告。 ## 準備工作 對于這個配置,需要三個文件。第一個是測試的實現(我們可以調用文件`leaky_implementation.cpp`): ```c++ #include "leaky_implementation.hpp" int do_some_work() { // we allocate an array double *my_array = new double[1000]; // do some work // ... // we forget to deallocate it // delete[] my_array; return 0; } ``` 還需要相應的頭文件(`leaky_implementation.hpp`): ```c++ #pragma once int do_some_work(); ``` 并且,需要測試文件(`test.cpp`): ```c++ #include "leaky_implementation.hpp" int main() { int return_code = do_some_work(); return return_code; } ``` 我們希望測試通過,因為`return_code`硬編碼為`0`。這里我們也期望檢測到內存泄漏,因為`my_array`沒有釋放。 ## 具體實施 下面展示了如何設置CMakeLists.txt來執行代碼動態分析: 1. 我們首先定義CMake最低版本、項目名稱、語言、目標和依賴關系: ```cmake cmake_minimum_required(VERSION 3.5 FATAL_ERROR) project(recipe-05 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_EXTENSIONS OFF) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_library(example_library leaky_implementation.cpp) add_executable(cpp_test test.cpp) target_link_libraries(cpp_test example_library) ``` 2. 然后,定義測試目標,還定義了`MEMORYCHECK_COMMAND`: ```cmake find_program(MEMORYCHECK_COMMAND NAMES valgrind) set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full") # add memcheck test action include(CTest) enable_testing() add_test( NAME cpp_test COMMAND $<TARGET_FILE:cpp_test> ) ``` 3. 運行測試集,報告測試通過情況,如下所示: ```shell $ ctest Test project /home/user/cmake-recipes/chapter-04/recipe-05/cxx-example/build Start 1: cpp_test 1/1 Test #1: cpp_test ......................... Passed 0.00 sec 100% tests passed, 0 tests failed out of 1 Total Test time (real) = 0.00 sec ``` 4. 現在,我們希望檢查內存缺陷,可以觀察到被檢測到的內存泄漏: ```shell $ ctest -T memcheck Site: myhost Build name: Linux-c++ Create new tag: 20171127-1717 - Experimental Memory check project /home/user/cmake-recipes/chapter-04/recipe-05/cxx-example/build Start 1: cpp_test 1/1 MemCheck #1: cpp_test ......................... Passed 0.40 sec 100% tests passed, 0 tests failed out of 1 Total Test time (real) = 0.40 sec -- Processing memory checking output: 1/1 MemCheck: #1: cpp_test ......................... Defects: 1 MemCheck log files can be found here: ( * corresponds to test number) /home/user/cmake-recipes/chapter-04/recipe-05/cxx-example/build/Testing/Temporary/MemoryChecker.*.log Memory checking results: Memory Leak - 1 ``` 5. 最后一步,應該嘗試修復內存泄漏,并驗證`ctest -T memcheck`沒有報告錯誤。 ## 工作原理 使用`find_program(MEMORYCHECK_COMMAND NAMES valgrind)`查找valgrind,并將`MEMORYCHECK_COMMAND`設置為其絕對路徑。我們顯式地包含CTest模塊來啟用`memcheck`測試操作,可以使用`CTest -T memcheck`來啟用這個操作。此外,使用`set(MEMORYCHECK_COMMAND_OPTIONS "--trace-children=yes --leak-check=full")`,將相關參數傳遞給Valgrind。內存檢查會創建一個日志文件,該文件可用于詳細記錄內存缺陷信息。 **NOTE**:*一些工具,如代碼覆蓋率和靜態分析工具,可以進行類似地設置。然而,其中一些工具的使用更加復雜,因為需要專門的構建和工具鏈。Sanitizers就是這樣一個例子。有關更多信息,請參見https://github.com/arsenm/sanitizers-cmake 。另外,請參閱第14章,其中討論了AddressSanitizer和ThreadSanitizer。* ## 更多信息 該方法可向測試面板報告內存缺陷,這里演示的功能也可以獨立于測試面板使用。我們將在第14章中重新討論,與CDash一起使用的情況。 有關Valgrind及其特性和選項的文檔,請參見http://valgrind.org 。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看