Input Validation Patterns
Checked Add
Arithmetic checks can reject a result before assigning it to program state.
pre-check
Checking against `limit - left` avoids computing a value that should be rejected.
output parameter
The function writes the sum only when the status says it is valid.
Checked Add
checked_add.c
Replay: real traced execution (multi-file project)
#include <stdio.h>
int checkedAdd(int left, int right, int limit, int *outSum) {
if (right > limit - left) {
return 0;
}
*outSum = left + right;
return 1;
}
int main(void) {
int right = 25;
int left = 40;
int limit = 100;
int sum = 0;
int ok = checkedAdd(left, right, limit, &sum);
printf("left=%d right=%d ok=%d sum=%d\n", left, right, ok, sum);
return 0;
}
#include <stdio.h>
int checkedAdd(int left, int right, int limit, int *outSum) {
if (right > limit - left) {
return 0;
}
*outSum = left + right;
return 1;
}
int main(void) {
int right = 5;
int left = 40;
int limit = 100;
int sum = 0;
int ok = checkedAdd(left, right, limit, &sum);
printf("left=%d right=%d ok=%d sum=%d\n", left, right, ok, sum);
return 0;
}
#include <stdio.h>
int checkedAdd(int left, int right, int limit, int *outSum) {
if (right > limit - left) {
return 0;
}
*outSum = left + right;
return 1;
}
int main(void) {
int right = 80;
int left = 40;
int limit = 100;
int sum = 0;
int ok = checkedAdd(left, right, limit, &sum);
printf("left=%d right=%d ok=%d sum=%d\n", left, right, ok, sum);
return 0;
}
right ← 25, left ← 40, limit ← 100, sum ← 0
11int main(void) {12 int right→ 25 = 25; //@right=5, 8013 int left→ 40 = 40;14 int limit→ 100 = 100;15 int sum→ 0 = 0;16 int ok = checkedAdd(left40, right25, limit100, &sum0);int checkedAdd(int left, int right, int limit, int *outSum)
3int checkedAdd(int left40, int right25, int limit100, int *outSum⟨addr A⟩) {4 if (right > limit - left) {5 return 0;6 }7 *outSum⟨addr A⟩ = left40 + right25;8 return 1;9}sum ← 65, ok ← 1
15 int sum = 0;16 int ok→ 1 = checkedAdd(left40, right25, limit100, &sum→ 65);1718 printf("left=%d right=%d ok=%d sum=%d\n", left40, right25, ok1, sum65);19 return 0;20}outputleft=40 right=25 ok=1 sum=65
right ← 5, left ← 40, limit ← 100, sum ← 0
11int main(void) {12 int right→ 5 = 5;13 int left→ 40 = 40;14 int limit→ 100 = 100;15 int sum→ 0 = 0;16 int ok = checkedAdd(left40, right5, limit100, &sum0);int checkedAdd(int left, int right, int limit, int *outSum)
3int checkedAdd(int left40, int right5, int limit100, int *outSum⟨addr A⟩) {4 if (right > limit - left) {5 return 0;6 }7 *outSum⟨addr A⟩ = left40 + right5;8 return 1;9}sum ← 45, ok ← 1
15 int sum = 0;16 int ok→ 1 = checkedAdd(left40, right5, limit100, &sum→ 45);1718 printf("left=%d right=%d ok=%d sum=%d\n", left40, right5, ok1, sum45);19 return 0;20}outputleft=40 right=5 ok=1 sum=45
right ← 80, left ← 40, limit ← 100, sum ← 0
11int main(void) {12 int right→ 80 = 80;13 int left→ 40 = 40;14 int limit→ 100 = 100;15 int sum→ 0 = 0;16 int ok = checkedAdd(left40, right80, limit100, &sum0);int checkedAdd(int left, int right, int limit, int *outSum)
3int checkedAdd(int left40, int right80, int limit100, int *outSum⟨addr A⟩) {4 if (right > limit - left) {if (right > limit - left)
3int checkedAdd(int left, int right, int limit, int *outSum) {4 if (right80 > limit100 - left40) {5 return 0;6 }ok ← 0
15 int sum = 0;16 int ok→ 0 = checkedAdd(left40, right80, limit100, &sum0);1718 printf("left=%d right=%d ok=%d sum=%d\n", left40, right80, ok0, sum0);19 return 0;20}outputleft=40 right=80 ok=0 sum=0