簡體   English   中英

移植到64位時如何避免size_t轉換為int警告?

[英]How to avoid size_t to int casting warnings when porting to 64 bit?

我必須將非常大的C ++傳統代碼庫轉換為64位。 我設法獲得了要編譯的基本模塊之一,但是即使在這個小模塊中,我也會收到800條警告:

warning C4267: = conversion from size_t to int, possible loss of data

我知道為什么會出現這些,但是要擺脫它們我有什么選擇? 有沒有什么系統的方法可以避免碰到每個實例?

一種選擇是禁用“數據丟失”警告。 為了限制禁用警告的效果,MS Visual Studio具有pushpop指令:

#pragma warning(push)
#pragma warning(disable: 4267)
// legacy code
#pragma warning(pop)
// normal code

這些#pragma偽指令特定於Visual Studio; 您可能想用#ifdef _MSC_VER來包裝它們。

這是思想。 我敢肯定,這些警告中的+ 90%可以忽略。 我有類似的問題,並且對以下內容有很多警告:

sumeType tab[10];
int items = std::size(tab);
// or
functionWhichExeptsInt(std::size(tab))

在上面的示例中,由於std::sizeconstexpr編譯器可以檢測到size值足夠小以適合int因此它不應報告warring,但可以。

問題是,在某些情況下此警告可以檢測到實際問題。 因此,禁用此警告不是一個好方法。

在我的項目中,我們決定繼續交戰,但不要將其視為錯誤:

  • 我們很快對其進行了審核,如果可以通過最小的更改來解決某些問題,我們會這樣做
  • 當所需的更改更加復雜時,我們只是估計存在錯誤的潛在危險(畢竟,我們將應用程序從32位更改為64位以獲得對更多內存的訪問權限)。 如果沒有發現風險,我們暫時將其忽略
  • 我們會在代碼更改時修復剩余的警告,並且我們現在也不會急於將其全部修復。

這更像是精神問題:“我現在可以忽略那些+100的警告嗎?”。 我也喜歡沒有警告的代碼,但有時最好與它們一起生活。

IMO這是一種更安全的方法。

要搜索並消除在將系統從32位移植到64位時出現的錯誤,使用PVS-Studio專用工具是合理的。 它是一種靜態代碼分析器,具有一組特定的診斷( 診斷64位錯誤 )。 在此處閱讀有關移植時的問題。

size_t隱式轉換為int時,分析器還將發出V103警告。 但是與編譯器不同的是,它以更智能的方式進行處理。 它並沒有抱怨一切。 如果知道源值的范圍很小,它將很安靜。

例:

for (size_t i = 0; i < 10; i++)
{
  int x = i; // i == [0..9], OK!
  //....
}

是的,誤報仍會發生,但數量會少得多。 此外,分析儀提供了大量選項來抑制誤報。

暫無
暫無

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

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