Vexil icon indicating copy to clipboard operation
Vexil copied to clipboard

Protect against overflows in BoxedFlagValues

Open huwr opened this issue 2 years ago • 1 comments

📒 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.

huwr avatar Mar 17 '23 01:03 huwr

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

No Coverage information No Coverage information
0.0% 0.0% Duplication

sonarqubecloud[bot] avatar Mar 17 '23 01:03 sonarqubecloud[bot]