ubuntu中使用snprintf的誤區

2021-07-22 15:47:13 字數 1022 閱讀 6217

近期在開發android驅動時遇到乙個有趣的現象:

1. 在android kernel中使用snprintf組包

char buf[256] = "abcd";

char test = 0xe1;  

snprintf(buf, sizeof(buf), "%s%02x", buf, test);

printk("buf = %s\n", buf);

結果:abcde1

2. 同樣在ubuntu中組包

結果:ffffffe1

這其實是兩個問題下面做簡要分析:

下面使用sprintf做簡要分析,snprintf是一樣的

1. sprintf 的原型為:

int sprintf(char *restrict s, const char *restrict format, ...);

其中 char* restrict s 的含義為通過s 指向的記憶體空間不得與其他指標引數指向的記憶體的空間重疊。比如如下的語句就是錯誤的用法, 因為引數1與引數3指向的記憶體重疊了。

但在android kernel中sprintf這種做法作為增強版的strcat,所以出現了android與ubuntu不一致現象。

sprintf(buf, "%s foo %d %d", buf, var1, var2);

在 ubuntu 8.10 所帶的 gcc 中,如果編譯時加入了優化選項(比如 -o1, -o2), 那麼sprinf 會首先將 s 清空,比如如下的程式會輸出 "fail", 而不是 "not fail"。

#include

char buf[80] = "not ";

int main()

作為補救方案,可以使用如下的語句來代替:

sprintf(buf+strlen(buf), " foo %d %d", var1, var2);

2、而對於在ubuntu列印中出現ffffff的問題其實是因為e1超出了char型別的限制,為android kernel char型別可以正常列印128以上的char型別資料。

Ubuntu中使用總結

查詢埠是否有程序守護用如下命令grep對應埠,如80為埠號 例 netstat nalp grep 80 netstat ntupl grep processname processname 程序名稱。netstat anop grep pid pid 程序id。ps ef grep client ...

在Ubuntu中使用Onedrive

寫在前面 linux的onedrive d其實並不好用,我用的時候它有時候只將檔案同步到雲端,而不將雲端檔案同步到本地的情況,而且文件檔案名不修改,它有時候就不同步,所以我用了沒多久就解除安裝了 當然也可能是我的網路不行 如果你仍然感興趣,這篇文章是我根據github上的教程結合其他博主部落格總結的...

ubuntu中使用切換超級使用者

由於 ubuntu 是基於 debian 的 linux 作業系統,在預設的情況下,是沒有超級使用者 superuser,root 的,但有些系統操作必須有超級使用者的許可權才能進行,如手動釋放記憶體等。在其他 linux 作業系統 如 fedora 下,可以使用 su 切換到超級使用者。當輸入 s...