Testing and Debugging
Error Return
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
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;
}
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);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}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
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);int safe_divide(int numerator, int denominator, int *result)
3int safe_divide(int numerator80, int denominator0, int *result⟨addr A⟩) {4 if (denominator == 0) {if (denominator == 0)
3int safe_divide(int numerator, int denominator, int *result) {4 if (denominator0 == 0) {5 return 0;6 }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
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);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}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