{"record":{"id":"a5494d3fc328d1e1","repo":"rust-lang/rust","slug":"must-specify-at-least-one-of-read-write-or-appen","errorCode":null,"errorMessage":"must specify at least one of read, write, or append access","messagePattern":"must specify at least one of read, write, or append access","errorType":"validation","errorClass":"io::Error","httpStatus":null,"severity":"error","filePath":"library/std/src/sys/fs/unix.rs","lineNumber":1170,"sourceCode":"    }\n\n    fn get_access_mode(&self) -> io::Result<c_int> {\n        match (self.read, self.write, self.append) {\n            (true, false, false) => Ok(libc::O_RDONLY),\n            (false, true, false) => Ok(libc::O_WRONLY),\n            (true, true, false) => Ok(libc::O_RDWR),\n            (false, _, true) => Ok(libc::O_WRONLY | libc::O_APPEND),\n            (true, _, true) => Ok(libc::O_RDWR | libc::O_APPEND),\n            (false, false, false) => {\n                // If no access mode is set, check if any creation flags are set\n                // to provide a more descriptive error message\n                if self.create || self.create_new || self.truncate {\n                    Err(io::Error::new(\n                        io::ErrorKind::InvalidInput,\n                        \"creating or truncating a file requires write or append access\",\n                    ))\n                } else {\n                    Err(io::Error::new(\n                        io::ErrorKind::InvalidInput,\n                        \"must specify at least one of read, write, or append access\",\n                    ))\n                }\n            }\n        }\n    }\n\n    fn get_creation_mode(&self) -> io::Result<c_int> {\n        match (self.write, self.append) {\n            (true, false) => {}\n            (false, false) => {\n                if self.truncate || self.create || self.create_new {\n                    return Err(io::Error::new(\n                        io::ErrorKind::InvalidInput,\n                        \"creating or truncating a file requires write or append access\",\n                    ));\n                }","sourceCodeStart":1152,"sourceCodeEnd":1188,"githubUrl":"https://github.com/rust-lang/rust/blob/7088e4b63a9516ebfbfe2ab2d999cf01a528ac14/library/std/src/sys/fs/unix.rs#L1152-L1188","documentation":"In get_access_mode(), when read, write, and append are all false AND no creation flag (create/create_new/truncate) is set either, there is no valid access mode to request from the OS, so the open is rejected as InvalidInput (unix.rs:1170-1173).","triggerScenarios":"`OpenOptions::new().open(p)` with no access or creation setters at all.","commonSituations":"Building an OpenOptions and forgetting any mode; expecting OpenOptions to default to read like C fopen.","solutions":["Add at least one of .read(true), .write(true), or .append(true).","For plain reading, use File::open(p) (which sets read) instead of a bare OpenOptions."],"exampleFix":"// before\nstd::fs::OpenOptions::new().open(\"f\")?;\n// after\nstd::fs::OpenOptions::new().read(true).open(\"f\")?","handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":"match std::fs::OpenOptions::new().open(p) {\n    Ok(f) => f,\n    Err(e) if e.kind() == std::io::ErrorKind::InvalidInput => {\n        return Err(e); // fix builder: set read/write/append\n    }\n    Err(e) => return Err(e),\n}","preventionTips":["Never call .open() on an OpenOptions with no access flag set.","Prefer File::open / File::create for the common read/write cases."],"tags":["rust","std","fs","unix","openoptions","platform"],"backgroundTag":null,"analyzedSha":"7088e4b63a9516ebfbfe2ab2d999cf01a528ac14","analyzedAt":"2026-08-10T14:17:03.603Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}