类对象的可变级别内存错误检测

时间:2016-05-26 10:20:15

标签: c++ valgrind

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检测到超过为“仪器”分配的写入时。但是没有检测到。

1 个答案:

答案 0 :(得分: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:抱歉我的英语不好。