Vexil
Vexil copied to clipboard
Protect against overflows in BoxedFlagValues
📒 Description
Previously, attempting to unwrap an Int from a BoxedFlagValue into an FlagValue that was not wide enough would cause a runtime error.
Now, we unwrap the Int from the BoxedFlagValue and convert it into the Int type’s fallible initialiser. That way, we know it will not be too big when we do the assignment.
🗳 Test Plan
- Unit tests included for all Int types (except Int64, which is a little harder)
✅ Checklist
- [x] I've added at least one test that validates that my change is working, if appropriate
- [x] I've followed the code style of the rest of the project
- [x] I've read the Contribution Guidelines
- [x] I've updated the documentation if necessary
😠 Not finished
It's not finished. Somehow, there's double-optionals are making it into the UserDefaults FlagValueSource's set value function.
/// Sets the value for the specified key
public func setFlagValue<Value>(_ value: Value?, key: String) throws where Value: FlagValue {
guard let value = value else { // unwraps a UInt16?? to UInt16? It must be `.some(nil)`
self.removeObject(forKey: key)
return
}
self.set(value.boxedFlagValue.object, forKey: key) // tries to send nil `UInt16?` in here, which fails.
}
I shall ponder because I'm not sure why they're double-optionalised now.
Kudos, SonarCloud Quality Gate passed! 
0 Bugs
0 Vulnerabilities
0 Security Hotspots
0 Code Smells
No Coverage information
0.0% Duplication