簡體   English   中英

strstr:使用不同版本的gcc進行不同的行為

[英]strstr: behavior different using different versions of gcc

我正在將一個與Ubuntu 8.04(gcc版本4.2.4)配合使用的程序移植到10.04(gcc版本4.4.3)。 我有以下代碼:

#include <stdio.h>
#include <string.h>

int main(void) {
  char p[100] = "////abcd";
  char *t;

  /* Remove duplicate slashes, saving only one of them */
  while (t = strstr(p, "//"))
    strcpy(t, t + 1);

  printf("%s\n", p);

  return 0;
}

結果應該是/abcd ,它與gcc 4.2.4一致。 對於4.4.3,輸出為/accd

你能否建議我使用兩種版本的gcc來提供正確的輸出代碼,並且最好解釋一下這里發生了什么。

提前致謝!

你很幸運。

strcpy文檔:

strcpy()函數應將s2指向的字符串(包括終止空字節)復制到s1指向的數組中。 如果在重疊的對象之間進行復制,則行為未定義。

在您的情況下,字符串重疊,您的程序調用未定義的行為。

它曾經工作但不再適用的一個可能原因是strcpy可以作為GCC的內置實現,如memmove (即在這種情況下是安全的),但由於性能原因,這變為非安全版本。 (這是純粹的猜測。)

要修復它,請使用memmove而不是strcpy ,例如:

while (t = strstr(p, "//")) {
  memmove(t, t+1, strlen(t)); // strlen(t)'s bytes worth of data
                              // will cover the string bytes left
                              // and the \0 terminator
}

這不是非常有效,但它可以移植 - memmove必須處理重疊的內存區域。

暫無
暫無

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

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