Input Validation Patterns
Enum Validation
Validate a raw integer before casting it into an enum used by later branches.
raw input
External values often arrive as plain integers, not typed enum constants.
safe cast
The cast happens only after a range check proves the enum value is expected.
Enum Validation
enum_validation.c
Replay: real traced execution (multi-file project)
#include <stdio.h>
enum Mode {
MODE_READ = 1,
MODE_WRITE = 2,
MODE_ADMIN = 3
};
int validMode(int raw, enum Mode *mode) {
if (raw < MODE_READ || raw > MODE_ADMIN) {
return 0;
}
*mode = (enum Mode)raw;
return 1;
}
int main(void) {
int rawMode = 2;
enum Mode mode = MODE_READ;
int ok = validMode(rawMode, &mode);
int canWrite = ok && mode != MODE_READ;
printf("rawMode=%d ok=%d mode=%d canWrite=%d\n", rawMode, ok, mode, canWrite);
return 0;
}
#include <stdio.h>
enum Mode {
MODE_READ = 1,
MODE_WRITE = 2,
MODE_ADMIN = 3
};
int validMode(int raw, enum Mode *mode) {
if (raw < MODE_READ || raw > MODE_ADMIN) {
return 0;
}
*mode = (enum Mode)raw;
return 1;
}
int main(void) {
int rawMode = 0;
enum Mode mode = MODE_READ;
int ok = validMode(rawMode, &mode);
int canWrite = ok && mode != MODE_READ;
printf("rawMode=%d ok=%d mode=%d canWrite=%d\n", rawMode, ok, mode, canWrite);
return 0;
}
#include <stdio.h>
enum Mode {
MODE_READ = 1,
MODE_WRITE = 2,
MODE_ADMIN = 3
};
int validMode(int raw, enum Mode *mode) {
if (raw < MODE_READ || raw > MODE_ADMIN) {
return 0;
}
*mode = (enum Mode)raw;
return 1;
}
int main(void) {
int rawMode = 3;
enum Mode mode = MODE_READ;
int ok = validMode(rawMode, &mode);
int canWrite = ok && mode != MODE_READ;
printf("rawMode=%d ok=%d mode=%d canWrite=%d\n", rawMode, ok, mode, canWrite);
return 0;
}
rawMode ← 2
17int main(void) {18 int rawMode→ 2 = 2; //@rawMode=0, 319 enum Mode mode = MODE_READ;20 int ok = validMode(rawMode2, &mode1);21 int canWrite = ok && mode != MODE_READ;int validMode(int raw, enum Mode *mode)
9int validMode(int raw2, enum Mode *mode⟨addr A⟩) {10 if (raw < MODE_READ || raw > MODE_ADMIN) {11 return 0;12 }13 *mode⟨addr A⟩ = (enum Mode)raw2;14 return 1;15}mode ← 2, ok ← 1, canWrite ← 1
19 enum Mode mode = MODE_READ;20 int ok→ 1 = validMode(rawMode2, &mode→ 2);21 int canWrite→ 1 = ok1 && mode2 != MODE_READ1;2223 printf("rawMode=%d ok=%d mode=%d canWrite=%d\n", rawMode2, ok1, mode2, canWrite1);24 return 0;25}outputrawMode=2 ok=1 mode=2 canWrite=1
rawMode ← 0
17int main(void) {18 int rawMode→ 0 = 0;19 enum Mode mode = MODE_READ;20 int ok = validMode(rawMode0, &mode1);21 int canWrite = ok && mode != MODE_READ;int validMode(int raw, enum Mode *mode)
9int validMode(int raw0, enum Mode *mode⟨addr A⟩) {10 if (raw < MODE_READ || raw > MODE_ADMIN) {if (raw < MODE_READ || raw > MODE_ADMIN)
9int validMode(int raw, enum Mode *mode) {10 if (raw0 < MODE_READ1 || raw > MODE_ADMIN3) {11 return 0;12 }ok ← 0, canWrite ← 0
19 enum Mode mode = MODE_READ;20 int ok→ 0 = validMode(rawMode0, &mode1);21 int canWrite→ 0 = ok0 && mode1 != MODE_READ1;2223 printf("rawMode=%d ok=%d mode=%d canWrite=%d\n", rawMode0, ok0, mode1, canWrite0);24 return 0;25}outputrawMode=0 ok=0 mode=1 canWrite=0
rawMode ← 3
17int main(void) {18 int rawMode→ 3 = 3;19 enum Mode mode = MODE_READ;20 int ok = validMode(rawMode3, &mode1);21 int canWrite = ok && mode != MODE_READ;int validMode(int raw, enum Mode *mode)
9int validMode(int raw3, enum Mode *mode⟨addr A⟩) {10 if (raw < MODE_READ || raw > MODE_ADMIN) {11 return 0;12 }13 *mode⟨addr A⟩ = (enum Mode)raw3;14 return 1;15}mode ← 3, ok ← 1, canWrite ← 1
19 enum Mode mode = MODE_READ;20 int ok→ 1 = validMode(rawMode3, &mode→ 3);21 int canWrite→ 1 = ok1 && mode3 != MODE_READ1;2223 printf("rawMode=%d ok=%d mode=%d canWrite=%d\n", rawMode3, ok1, mode3, canWrite1);24 return 0;25}outputrawMode=3 ok=1 mode=3 canWrite=1