Defensive Programming
Bounds Checks
Explicit bounds checks let code avoid reading outside a vector.
bounds check
A vector index is safe only when it is greater than or equal to zero and less than the vector size.
Bounds Checks
bounds_checks.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <vector>
int main() {
std::vector<int> scores{72, 85, 91};
int index = 2;
bool inRange = index >= 0 && index < static_cast<int>(scores.size());
int score = inRange ? scores[index] : -1;
std::cout << "index=" << index << std::endl;
std::cout << "inRange=" << inRange << std::endl;
std::cout << "score=" << score << std::endl;
return 0;
}
#include <iostream>
#include <vector>
int main() {
std::vector<int> scores{72, 85, 91};
int index = 0;
bool inRange = index >= 0 && index < static_cast<int>(scores.size());
int score = inRange ? scores[index] : -1;
std::cout << "index=" << index << std::endl;
std::cout << "inRange=" << inRange << std::endl;
std::cout << "score=" << score << std::endl;
return 0;
}
#include <iostream>
#include <vector>
int main() {
std::vector<int> scores{72, 85, 91};
int index = 5;
bool inRange = index >= 0 && index < static_cast<int>(scores.size());
int score = inRange ? scores[index] : -1;
std::cout << "index=" << index << std::endl;
std::cout << "inRange=" << inRange << std::endl;
std::cout << "score=" << score << std::endl;
return 0;
}
scores ← [72, 85, 91], index ← 2, inRange ← 1, score ← 91
4int main() {5 std::vector<int> scores→ [72, 85, 91]{72, 85, 91};6 int index→ 2 = 2; //@index=0, 578 bool inRange→ 1 = index2 >= 0 && index < static_cast<int>(scores[72, 85, 91].size());9 int score→ 91 = inRange1 ? scores[72, 85, 91][index2] : -1;1011 std::cout << "index=" << index2 << std::endl;12 std::cout << "inRange=" << inRange1 << std::endl;13 std::cout << "score=" << score91 << std::endl;14 return 0;15}outputindex=2 inRange=1 score=91
scores ← [72, 85, 91], index ← 0, inRange ← 1, score ← 72
4int main() {5 std::vector<int> scores→ [72, 85, 91]{72, 85, 91};6 int index→ 0 = 0;78 bool inRange→ 1 = index0 >= 0 && index < static_cast<int>(scores[72, 85, 91].size());9 int score→ 72 = inRange1 ? scores[72, 85, 91][index0] : -1;1011 std::cout << "index=" << index0 << std::endl;12 std::cout << "inRange=" << inRange1 << std::endl;13 std::cout << "score=" << score72 << std::endl;14 return 0;15}outputindex=0 inRange=1 score=72
scores ← [72, 85, 91], index ← 5, inRange ← 0, score ← -1
4int main() {5 std::vector<int> scores→ [72, 85, 91]{72, 85, 91};6 int index→ 5 = 5;78 bool inRange→ 0 = index5 >= 0 && index < static_cast<int>(scores[72, 85, 91].size());9 int score→ -1 = inRange0 ? scores[72, 85, 91][index5] : -1;1011 std::cout << "index=" << index5 << std::endl;12 std::cout << "inRange=" << inRange0 << std::endl;13 std::cout << "score=" << score-1 << std::endl;14 return 0;15}outputindex=5 inRange=0 score=-1