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

right
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;
}
  1. 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);
  2. 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}
  3. 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
  1. 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);
  2. 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}
  3. 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
  1. 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);
  2. 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) {
  3. if (right > limit - left)

    3int checkedAdd(int left, int right, int limit, int *outSum) {4    if (right80 > limit100 - left40) {5        return 0;6    }
  4. 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