A helper can return a status code and write the result through an output pointer.

status return The return value reports whether the helper succeeded.
output pointer The output pointer receives the computed value only on the successful path.

Error Return

denominator
error_return.c
Replay: real traced execution (multi-file project)
#include <stdio.h>

int safe_divide(int numerator, int denominator, int *result) {
    if (denominator == 0) {
        return 0;
    }

    *result = numerator / denominator;
    return 1;
}

int main(void) {
    int denominator = 4;
    int result = 0;
    int ok = safe_divide(80, denominator, &result);

    printf("ok=%d result=%d\n", ok, result);
    return 0;
}
#include <stdio.h>

int safe_divide(int numerator, int denominator, int *result) {
    if (denominator == 0) {
        return 0;
    }

    *result = numerator / denominator;
    return 1;
}

int main(void) {
    int denominator = 0;
    int result = 0;
    int ok = safe_divide(80, denominator, &result);

    printf("ok=%d result=%d\n", ok, result);
    return 0;
}
#include <stdio.h>

int safe_divide(int numerator, int denominator, int *result) {
    if (denominator == 0) {
        return 0;
    }

    *result = numerator / denominator;
    return 1;
}

int main(void) {
    int denominator = 20;
    int result = 0;
    int ok = safe_divide(80, denominator, &result);

    printf("ok=%d result=%d\n", ok, result);
    return 0;
}
  1. denominator ← 4, result ← 0

    12int main(void) {13    int denominator→ 4 = 4; //@denominator=0, 2014    int result→ 0 = 0;15    int ok = safe_divide(80, denominator4, &result0);
  2. int safe_divide(int numerator, int denominator, int *result)

    3int safe_divide(int numerator80, int denominator4, int *result⟨addr A⟩) {4    if (denominator == 0) {5        return 0;6    }78    *result⟨addr A⟩ = numerator80 / denominator4;9    return 1;10}
  3. result ← 20, ok ← 1

    14    int result = 0;15    int ok→ 1 = safe_divide(80, denominator4, &result→ 20);1617    printf("ok=%d result=%d\n", ok1, result20);18    return 0;19}
    outputok=1 result=20
  1. denominator ← 0, result ← 0

    12int main(void) {13    int denominator→ 0 = 0;14    int result→ 0 = 0;15    int ok = safe_divide(80, denominator0, &result0);
  2. int safe_divide(int numerator, int denominator, int *result)

    3int safe_divide(int numerator80, int denominator0, int *result⟨addr A⟩) {4    if (denominator == 0) {
  3. if (denominator == 0)

    3int safe_divide(int numerator, int denominator, int *result) {4    if (denominator0 == 0) {5        return 0;6    }
  4. ok ← 0

    14    int result = 0;15    int ok→ 0 = safe_divide(80, denominator0, &result0);1617    printf("ok=%d result=%d\n", ok0, result0);18    return 0;19}
    outputok=0 result=0
  1. denominator ← 20, result ← 0

    12int main(void) {13    int denominator→ 20 = 20;14    int result→ 0 = 0;15    int ok = safe_divide(80, denominator20, &result0);
  2. int safe_divide(int numerator, int denominator, int *result)

    3int safe_divide(int numerator80, int denominator20, int *result⟨addr A⟩) {4    if (denominator == 0) {5        return 0;6    }78    *result⟨addr A⟩ = numerator80 / denominator20;9    return 1;10}
  3. result ← 4, ok ← 1

    14    int result = 0;15    int ok→ 1 = safe_divide(80, denominator20, &result→ 4);1617    printf("ok=%d result=%d\n", ok1, result4);18    return 0;19}
    outputok=1 result=4