请参阅rust example中的以下代码。有没有静态分析工具来检测这个问题?
#include<iostream>
#include<vector>
#include<string>
int main() {
std::vector<std::string> v;
v.push_back("Hello");
std::string& x = v[0];
v.push_back("world");
std::cout << x;
}
答案 0 :(得分:1)
开源程序“cppcheck”从根本上说具有检测此类错误的能力。根据其description,它可以检测到:
[...]
- for vectors:使用push_back后使用迭代器/指针
[...]
不幸的是,我测试的版本(1.63)没有检测到代码段中的错误。但是,从引用更改为迭代器会产生一种显然可以检测到的情况:
#include<iostream>
#include<vector>
#include<string>
int main() {
std::vector<std::string> v;
v.push_back("Hello");
std::string& x = v[0];
std::vector<std::string>::iterator it = v.begin();
v.push_back("world");
std::cout << *it;
}
将其存储在test.cpp
并运行cppcheck:
cppcheck --std=c++03 ./test.cpp
我得到以下输出:
Checking test.cpp...
[test.cpp:15]: (error) After push_back(), the iterator 'it' may be invalid.
我认为这与你正在寻找的非常接近。