| #![allow(unused_must_use)] |
| #![warn(clippy::nonsensical_open_options)] |
| |
| use std::fs::OpenOptions; |
| |
| trait OpenOptionsExt { |
| fn truncate_write(&mut self, opt: bool) -> &mut Self; |
| } |
| |
| impl OpenOptionsExt for OpenOptions { |
| fn truncate_write(&mut self, opt: bool) -> &mut Self { |
| self.truncate(opt).write(opt) |
| } |
| } |
| |
| fn main() { |
| OpenOptions::new().read(true).truncate(true).open("foo.txt"); |
| //~^ nonsensical_open_options |
| |
| OpenOptions::new().append(true).truncate(true).open("foo.txt"); |
| //~^ nonsensical_open_options |
| |
| OpenOptions::new().read(true).read(false).open("foo.txt"); |
| //~^ nonsensical_open_options |
| |
| OpenOptions::new() |
| .create(true) |
| .truncate(true) // Ensure we don't trigger suspicious open options by having create without truncate |
| .create(false) |
| //~^ nonsensical_open_options |
| .open("foo.txt"); |
| OpenOptions::new().write(true).write(false).open("foo.txt"); |
| //~^ nonsensical_open_options |
| |
| OpenOptions::new().append(true).append(false).open("foo.txt"); |
| //~^ nonsensical_open_options |
| |
| OpenOptions::new().truncate(true).truncate(false).open("foo.txt"); |
| //~^ nonsensical_open_options |
| |
| std::fs::File::options().read(true).read(false).open("foo.txt"); |
| //~^ nonsensical_open_options |
| |
| let mut options = std::fs::OpenOptions::new(); |
| options.read(true); |
| options.read(false); |
| // Possible future improvement: recognize open options method call chains across statements. |
| options.open("foo.txt"); |
| |
| let mut options = std::fs::OpenOptions::new(); |
| options.truncate(true); |
| options.create(true).open("foo.txt"); |
| |
| OpenOptions::new().create(true).truncate_write(true).open("foo.txt"); |
| } |