2016-03-30 23 views
0

Ürünü çoğaltmak için aşağıya yazın. Bu durumda sınır dışı hatası bildirmek için cppcheck doğru mu? Hata memcpy ile aynı hatta raporlanır.cppcheck şikayetler Arabellek sınırların dışına çıktı. Neden ve nasıl düzeltebilirim?

#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 'yerine' 1.01A 'boyutunu kullanın – CinCout

cevap

1

literal "1.01A" seni altı karakterden oluşan bir dizi için bir işaretçi vermek dize, ondan 15 karakter okumaya çalışın. Verileri sınırlar dışında okuduğunuz için, bu içerikler belirsiz olduğundan tanımsız davranış var.

+0

Elbette, kaynağı düşünmedik. Bu dizi içindeki garip karakterleri açıklar. –

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 
İlgili konular