簡體   English   中英

C ++在我的計算機上工作正常但在leetcode上獲取地址清理程序堆緩沖區溢出錯誤

[英]C++ works fine at my computer but gets address sanitizer heap-buffer-overflow errors on leetcode

我試圖解決leetcode問題“929.獨特的電子郵件地址”,代碼在我的計算機上運行在Visual Studio Code上正常但是當我將它粘貼在leetcode上時,我得到了地址清理程序堆緩沖區溢出錯誤。 代碼如下所示:

class Solution {
 public:
  int numUniqueEmails(vector<string>& emails) {
    string::iterator it;
    for (int i = 0; i < emails.size(); i++) {
      for (it = emails[i].begin(); *it != '@'; it++) {
        if (*it == '.') {
          emails[i].erase(it);
          it--;
        }
        if (*it == '+') {
          while (*it != '@') {
            emails[i].erase(it);
          }
          break;
        }
      }
      sort(emails.begin(), emails.end());
      for (int j = 0; j < emails.size(); j++) {
        if (emails[j] == emails[j + 1]) {
          emails.erase(emails.begin() + j);
          j--;
        }
      }
    }
    return emails.size();
  }
};

有人能讓我知道錯誤發生的原因嗎?

因為以下循環:

for (it = emails[i].begin(); *it != '@'; it++)
   ...

while (*it != '@')
  ...

在字符串上迭代it ,從不驗證字符串的結尾是否到達。 如果您在輸入數據中有一個格式錯誤的電子郵件地址,那么您就會超出范圍。 所以UB。

另外,你也在這里出界:

 for (int j = 0; j < emails.size(); j++) {
    if (emails[j] == emails[j + 1]) {  // what when j == size-1 ????

最后一個潛在的討厭問題(但可能影響結果):你的第一個for循環應該在sort()之前結束。 為什么? 因為運氣不好,排序會改變元素的順序,導致未處理的地址在當前i索引之前移動,從而保持未處理狀態。

演示與一些額外的中間結果顯示和一些極端情況。

暫無
暫無

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

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