2016-03-30 33 views
0

以下のコードを再現してください。この場合、範囲外のエラーを報告するにはcppcheckは正しいですか?エラーはmemcpyの行で報告されます。cppcheckが不平を言いますバッファが範囲外にアクセスされています。なぜ、どのように修正するのですか?

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

typedef struct { 
    uint32_t serial_number; 
    uint8_t software_version[15]; 
} STATIC_HARDWARE_DATA; 

typedef struct { 
    uint16_t    result_code; 
    uint8_t    startup_type; 
    STATIC_HARDWARE_DATA payment_data; 
} MSG_DETAILS; 

int main() { 

    MSG_DETAILS msg = {0}; 
    msg.result_code = 0; 
    msg.startup_type = 2; 
    msg.payment_data.serial_number = 0xAAAA; 
    // on line below cppcheck says: Buffer is accessed out of bounds 
    memcpy(msg.payment_data.software_version, "1.01A", 15); 

    printf("%s", msg.payment_data.software_version); // prints correct 1.01A 

    /* in memory msg.payment_data.software_version is: 
     '1', '.', '0', '1', 'A', '\0', '\0', '\0', '_', '\0', '_', 'n', '\0', 'a' 

     The characters on end of array are unexpected? 
    */ 

} 
+0

「15」の代わりに「1.01A」のサイズを使用します。 – CinCout

答えて

1

文字列リテラル"1.01A"は、あなたがそれから15個の文字を読み取ろうと、6つの文字の配列にあなたにポインタを与えます。範囲外のデータを読み取るので、の定義されていない動作があります。その内容はです。不確定です。

+0

もちろん、ソースは考えられませんでした。それは配列内の奇妙な文字を説明します。 –

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

typedef struct { 
    uint32_t serial_number; 
    uint8_t software_version[15]; 
} STATIC_HARDWARE_DATA; 

typedef struct { 
    uint16_t    result_code; 
    uint8_t    startup_type; 
    STATIC_HARDWARE_DATA payment_data; 
} MSG_DETAILS; 

int main() { 

    MSG_DETAILS msg = {0}; 
    msg.result_code = 0; 
    msg.startup_type = 2; 
    msg.payment_data.serial_number = 0xAAAA; 
    // on line below cppcheck says: Buffer is accessed out of bounds 
    memcpy(msg.payment_data.software_version, "1.01A", 6);//<-- size should be 6 including \0. 

    printf("%s", msg.payment_data.software_version); // prints correct 1.01A 

    /* in memory msg.payment_data.software_version is: 
     '1', '.', '0', '1', 'A', '\0', '\0', '\0', '_', '\0', '_', 'n', '\0', 'a' 

     The characters on end of array are unexpected? 
    */ 

} 

o/p: 
[email protected]:~/rabi/c$ gcc gg.c 
[email protected]:~/rabi/c$ ./a.out 
1.01A 
関連する問題