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

rawMode
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;
}
  1. 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;
  2. 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}
  3. 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
  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;
  2. int validMode(int raw, enum Mode *mode)

    9int validMode(int raw0, enum Mode *mode⟨addr A⟩) {10    if (raw < MODE_READ || raw > MODE_ADMIN) {
  3. 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    }
  4. 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
  1. 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;
  2. 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}
  3. 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