簡體   English   中英

如何檢查給定文件是否存在依賴項錯誤?

[英]How do I check whether given files have dependency bugs?

我對C ++相當陌生,並已獲得以下任務:

鑒於我具有以下文件集:alpha.cpp,bravo.cpp和charlie.cpp,我應該創建一個程序來檢查這些文件是否存在依賴項錯誤。

我的想法是讓程序讀取文件,創建鄰接表,將每個文件作為頂點,如果一個.cpp文件包含另一個.cpp文件,則從一個節點到另一個節點的有向邊。 因此,總的來說,我需要在圖形上進行深度優先搜索,以查看圖形是否具有任何后邊緣。

那是正確的軌道嗎? 我覺得我知道該怎么做,但是我不確定如何准確地實現它。

我會在您的構建系統上使用一些解析魔術。 我有一個Makefile,可在這里用於許多項目。 它解析出包含並為其生成目標。

關於Make之類的工具,它們必須為您進行圖形遍歷。 他們通過采取所有的部分排序(依賴性聲明)並對其進行拓撲排序來獲得完整的排序(對文件進行線性化,以便如果A依賴於B,則B在A之前)來完成此操作。

但是,關於拓撲排序的問題是它僅存在於直接非循環圖上。 因此,如果生成像Makefile這樣的依賴項,並且有任何周期,構建將失敗,這就是您想要的,因為當您嘗試遞歸包含內容時,無論如何都會發生。

順便說一句:對您問題中每個注釋的“依賴關系錯誤”的定義不是很有用。 一般來說, ah包括bh包括ah不必是任何形式的錯誤。 如果包含它們的文件可以編譯,那么顯然您具有有效的C ++。 因此,不是錯誤。 出現以下情況:

  1. 給定的依賴周期可能是不必要的:有些bh可能實際上不需要包括ah 編譯成功。

  2. 給定的依賴關系周期可能是必需的,但是有效的:有些bh可能需要ah內容,並且可能會提供一些返回給ah ,但是include語句和依賴項的順序必須使它起作用。 編譯成功。

  3. 給定的依賴關系周期可能是必要的,並且是無效的:無法滿足所述的依賴關系。 編譯失敗。

要檢測#3,您只需要編譯文件,如果編譯失敗,則可能存在依賴性錯誤。

ahbh中的聲明/定義以及include語句可能會重新排序,從而將#3轉換為#2。

#2和#1不一定是bug,但是您必須完全解析文件才能確定是這種情況。

當然,您可以簡單地聲明這些循環在您的項目中是不允許的。 所以它們違反了您的項目規則,也許讓您稱它們為bug :)

如果您正在尋找查看依賴關系的工具,則可以考慮使用:

  • makedependg++ -MD (或clang++ -MD )來生成#include -dependencies。 然后建立一個圖來檢測循環。
  • g++ -cnm-U--defined-only )讀取目標文件中定義和需要的符號。 您甚至可以只比較已定義和已聲明符號的列表(包括在類似/usr/lib64/libstdc++.so.6地方定義的符號),以查看是否根本缺少符號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM