{"record":{"id":"d76b9b517ad6fbd6","repo":"Intervention/image","slug":"border-size-must-be-greater-than-or-equal-to-0","errorCode":null,"errorMessage":"Border size must be greater than or equal to 0","messagePattern":"Border size must be greater than or equal to 0","errorType":"exception","errorClass":"Intervention\\Image\\Exceptions\\InvalidArgumentException","httpStatus":null,"severity":"error","filePath":"src/Geometry/Traits/HasBorder.php","lineNumber":37,"sourceCode":"     *\n     * @throws InvalidArgumentException\n     */\n    public function setBorder(string|ColorInterface $color, int $size = 1): self\n    {\n        return $this->setBorderSize($size)->setBorderColor($color);\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @see DrawableInterface::setBorderSize()\n     *\n     * @throws InvalidArgumentException\n     */\n    public function setBorderSize(int $size): self\n    {\n        if ($size < 0) {\n            throw new InvalidArgumentException(\n                'Border size must be greater than or equal to 0',\n            );\n        }\n\n        $this->borderSize = $size;\n\n        return $this;\n    }\n\n    /**\n     * {@inheritdoc}\n     *\n     * @see DrawableInterface::borderSize()\n     */\n    public function borderSize(): int\n    {\n        return $this->borderSize;\n    }","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/Intervention/image/blob/5598b9e39751c34afc5cdee84abef77f92c26f68/src/Geometry/Traits/HasBorder.php#L19-L55","documentation":"Drawables (Rectangle, Ellipse, Circle, Polygon, Line, Bezier — anything using the HasBorder trait) reject negative border sizes. A border thickness of 0 is valid and means 'no border'; negative values have no rendering meaning and fail fast in setBorderSize(). Note that setBorder($color, $size) delegates to this setter, so the error can surface from either method.","triggerScenarios":"$rectangle->setBorderSize(-1), or $rectangle->setBorder('fff', -2). Triggered by any drawable using HasBorder, including via tests exercising setBorder/setBorderSize.","commonSituations":"Trying to 'remove' a border by passing a negative size instead of 0, or computing border thickness from user input / diff arithmetic that goes negative (e.g. $size - $inset where $inset > $size).","solutions":["Pass 0 to disable the border: setBorderSize(0) or setBorder($color, 0)","Clamp computed sizes: max(0, $calculatedBorderSize)","Validate user-supplied border thickness as int >= 0 before applying"],"exampleFix":"// before\n$shape->setBorder('fff', -1); // attempt to remove border\n\n// after\n$shape->setBorder('fff', 0); // border disabled","handlingStrategy":"validation","validationCode":"$border = max(0, $thickness); // or use 0 explicitly to disable\n$shape->setBorderSize($border);","typeGuard":"function isValidBorderSize(int $size): bool\n{\n    return $size >= 0;\n}","tryCatchPattern":"try {\n    $shape->setBorder('fff', $size);\n} catch (InvalidArgumentException $e) {\n    $shape->setBorder('fff', 0); // degrade to no border\n}","preventionTips":["Use 0, not a negative value, to remove a border","Validate user-supplied thickness as int >= 0 at the input layer","Watch subtraction idioms ($a - $b) that can go negative"],"tags":["drawable","border","validation","geometry"],"backgroundTag":"negative-value-argument","analyzedSha":"5598b9e39751c34afc5cdee84abef77f92c26f68","analyzedAt":"2026-08-23T02:17:31.068Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}