2016-05-26 2 views
0

Инструмент Valgrind не обнаруживает следующую ошибку в коде.Обнаружение ошибок памяти уровня переменного объекта класса

#include <iostream> 
#include <string.h> 

using namespace std; 

class Instrument 
{ 
    public: 
     char instrumentId[16]; 
     char symbol[16]; 
     char cusip[16]; 

    public: 
     void Pack() 
     { 
      memset(instrumentId, 'I', 16); 
      memset(cusip, 'C', 16); 
      memset(symbol, 'S', 18); // This is wrong 
     } 
}; 

int main(int argc, char** argv) 
{ 
    Instrument* ins = new Instrument(); 
    ins->Pack(); 
}; 

Есть ли инструмент, способный обнаружить эти ошибки. Когда он пишет больше, чем выделено для «Инструмента», обнаружен Valgrind. Однако это не обнаружено.

+0

Примечание: не '#include ' –

+0

Тогда как насчет memset? –

+0

@ DieterLücking почему бы и нет? –

ответ

2

Я полагаю, вы должны использовать хорошие инструменты для статического анализа.

К примеру, с помощью cppcheck

cppcheck tmp_001-98,11,14,gcc,clang.cpp 

я получить

Checking tmp_001-98,11,14,gcc,clang.cpp... 
[tmp_001-98,11,14,gcc,clang.cpp:19]: (error) Buffer is accessed out of bounds: symbol 
[tmp_001-98,11,14,gcc,clang.cpp:27]: (error) Memory leak: ins 

И грести 19, очевидно,

memset(symbol, 'S', 18); // This is wrong 

p.s .: простите за мой плохой английский.