2016-03-30 3 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

Используйте размер '1.01A' вместо' 15' – CinCout

ответ

1

Строковый литерал "1.01A" дать вам указатель на массив из шести символов, вы пытаетесь прочитать 15 символов из нее. Поскольку вы читаете данные за пределами, вы имеете неопределенное поведение, так как это содержимое неопределенное.

+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 
Смежные вопросы