簡體   English   中英

C4496 和 C6387 用於使用 strcpy 和 strcat

[英]C4496 and C6387 for using strcpy and strcat

我正在嘗試通過 strlen() 函數將函數中的 2 個字符串復制到新的動態內存中。

char* PairSortedArrays(char a[], char b[])
{
    char* p1 = (char*)malloc(strlen(a) + strlen(b) + 1);
    if(p1)
    {
    strcpy(p1, a);
    strcat(p1, b);
    }
    return p1;
}

獲取編譯器錯誤:

Severity    Code    Description Project File    Line    Suppression State
Error   C4996   'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.   check   C:\Users\97254\source\repos\check\check\Source.c    35  

不要使用 strcat,因為您擁有所有可用信息。

char *strdupcat(const char *str1, const char *str2)
{
    size_t str1Len;
    char *result = NULL;

    if(str1 && str2)
    {
        result = malloc((str1Len = strlen(str1)) + strlen(str2) + 1);
        if(result)
        {
            strcpy(result, str1);
            strcpy(result + str1Len, str2)
        }
    }
    return result;
}

我不確定這是您實際問題的一部分,但 strcpy() 不安全並且可能導致緩沖區溢出。 順便說一句,你的編譯器不應該因為這個而無法編譯......但基於微軟的帖子:

“ 一些 C 運行時庫函數已被棄用,因為它們不安全且具有更安全的變體。其他一些則被棄用,因為它們已過時。”

https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/compiler-warning-level-3-c4996?view=vs-2019

希望這有幫助。

較舊的字符串函數,安全性較低的版本被標記為已棄用,新版本具有 _s(“安全”)后綴(例如:strcpy_s)。

在你的情況下,

“strcpy”函數無法判斷您正在復制的源字符串對於其目標緩沖區是否太大。

但是在安全的"strcpy_s" 中,將緩沖區的大小作為參數,因此它可以確定是否會發生緩沖區溢出。

例子:

如果您使用 strcpy_s 將 11 個字符復制到 10 個字符的緩沖區中,那是您的錯誤; strcpy_s 無法糾正您的錯誤,但它可以檢測您的錯誤並通過調用無效參數處理程序通知您。

暫無
暫無

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

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